派生对象到基础对象的向量转换与数组转换
vector cast vs array cast of derived object to base object
这是一道关于 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
中。因为 y
是 A
的向量,所以 b
的 B
部分在复制过程中丢失了。这叫做切片.
这是一道关于 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
中。因为 y
是 A
的向量,所以 b
的 B
部分在复制过程中丢失了。这叫做切片.