未处理的异常 - c ++程序在强制转换时停止

时间:2014-05-17 12:39:08

标签: c++ inheritance casting subclass superclass

我有几个结构:

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]);

我做错了什么?

3 个答案:

答案 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分配包含的对象。)