这是关于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;
}
答案 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 })
将a
和b
复制到向量y
中。由于y
是A
的向量,B
b
部分会在复制过程中丢失。这称为切片。