向量转换vs派生对象的数组转换为基础对象

时间:2015-03-07 14:56:17

标签: c++ casting

这是关于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;
}

2 个答案:

答案 0 :(得分:4)

诀窍是注意向量中存储了什么类型的对象。你有一个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.

答案 1 :(得分:1)

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