矢量强制转换与派生对象到基对象的数组转换

vector cast vs array cast of derived object to base object

本文关键字:转换 对象 数组 派生      更新时间:2023-10-16

这是关于 c++ 评估测试的问题。我不明白为什么矢量转换与数组转换不同。具体来说,这输出 1413。为什么不是1414?x 数组声明中对 &b 的引用是否会导致这种情况?

#include <iostream>
#include <vector>
class A
{
public:
    A(int n = 0) : m_n(n) { }
public:
    virtual int f() const { return m_n; }
    virtual ~A() { }
protected:
    int m_n;
};
class B
    : public A
{
public:
    B(int n = 0) : A(n) { }
public:
    virtual int f() const { return m_n + 1; }
};
int main()
{
    const A a(1);
    const B b(3);
    const A *x[2] = { &a, &b };
    typedef std::vector<A> V;
    V y({ a, b });
    V::const_iterator i = y.begin();
    std::cout << x[0]->f() << x[1]->f()
             << i->f() << (i + 1)->f() << std::endl;
    return 0;
}
诀窍

是注意向量中存储的对象类型。您有一个typedef std::vector<A> V说此向量类型仅存储 A 类型的对象(仅存储)。

调用构造函数时,您传入了 A 型和 B 型的对象,但向量只知道 A 型...所以它这样做(概念上):

y.push_back( A( a ) )
y.push_back( A( b ) )

这是一个复制构造函数调用...其中对于类型 A 自动定义为 A( A const & ) .这允许您从 B 类型的对象创建类型 A 的对象。简而言之,矢量中的所有对象都是从其他对象创建的 A 类型。

V y({ a, b }) a复制并b到向量y中。因为yA的向量,bB部分在复制过程中会丢失。这称为切片