我有几个结构:
struct Token
{
//some content
}
Then follows a bunch of structs that inherit from Token:
struct A : public Token{
//Stuff
}
.
.
.
struct Z : public Token{
//Other stuff
}
我有一个向量std :: vector填充了子类A到Z,当我尝试将向量中的任何元素强制转换为子类时,我的程序崩溃了。我正在通过以下方式进行投射:
A subclass = *((A * ) &vector[0]);
我做错了什么?
答案 0 :(得分:1)
有意义的用法是
A &subclassref = vector[0]);
在上面一行中,没有创建新对象。
BTW您的矢量类型是什么,您想要实现什么?如果在单个向量中存储类型为A到Z的对象,则可能在某个时间点遭受对象切片。
答案 1 :(得分:1)
在用例中将指针从一种类型转换为另一种类型时,应该使用dynamic_cast
。
您使用的是C style cast
,我强烈建议您使用dynamic_cast
。
因此,您的代码应该类似于:
if(dynamic_cast<A *>(vector[0]))
A subclass = *(dynamic_cast<A *>(vector[0]));
当dynamic_cast
失败时,它将返回NULL
指针,您应该妥善处理它。
有关详细信息,请参阅dynamic_cast and static_cast in C++。
此外,When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?将帮助您了解更多类型的演员阵容。
答案 2 :(得分:1)
这个答案可能有误,因为我猜测你是如何填充std::vector<>
的。
您根本无法将子类的对象放入std::vector<Base>
。 std::vector<Base>
中的所有对象都属于Base
类型。如果您尝试这样的事情:
std::vector<Base> myVec;
myVec.push_back(Derived1(...));
首先构造一个类Derived1
的对象,然后将其拼接到类Base
的对象中,i。即类Base
的新对象是从派生对象复制构造的。只有这个拷贝构造的基类对象才会在std::vector<>
。
如果要拥有std::vector<>
多态对象,则必须使用指针类型作为模板参数(并因此使用new
分配包含的对象。)