矢量强制转换与派生对象到基对象的数组转换
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
部分在复制过程中会丢失。这称为切片。
相关文章:
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 将父类对象强制转换为子类的问题
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 已转换对象的地址
- 如何在OpenGL中使用关键事件来转换对象
- 使用父类实例化的向下转换对象
- 静态强制转换允许转换对象指针,但不允许转换整数
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 找到对象类型后,是否可以使用 static_cast 强制转换对象
- 旨在复制/转换对象的功能系列的模板
- luabind 如何隐式强制转换对象
- 转换对象
- 使用隐式可转换对象调用move重载函数时的编译错误
- 关于在 cpp 中转换对象的两个问题
- 在运行时根据实例变量强制转换对象(c++)
- 使用用户定义的类型强制转换对象
- 在c++中转换对象
- 从"int"到非标量类型赋值运算符的转换 - 对象到 int
- 在屏幕上转换对象可编程管道
- 在 C 样式类型转换期间,关于强制转换对象的地址空间的实际情况