Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未处理的异常-c++;节目在演员阵容中停止_C++_Inheritance_Casting_Subclass_Superclass - Fatal编程技术网

C++ 未处理的异常-c++;节目在演员阵容中停止

C++ 未处理的异常-c++;节目在演员阵容中停止,c++,inheritance,casting,subclass,superclass,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,当我试图将向量中的任何元素转换为子类时,我的程序崩溃了。我正在通过以下操

我有几个结构:

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

我做错了什么?

一个有意义的用法是

A &subclassref = vector[0]);
在上面的行中,不创建新对象


顺便问一下,你的向量是什么类型的,你到底想要实现什么?如果将A到Z类型的对象存储在单个向量中,它可能在某个时间点遭受对象切片。

一个有意义的用法是

A &subclassref = vector[0]);
在上面的行中,不创建新对象


顺便问一下,你的向量是什么类型的,你到底想要实现什么?如果将A到Z类型的对象存储在单个向量中,它可能在某个时间点遭受对象切片。

一个有意义的用法是

A &subclassref = vector[0]);
在上面的行中,不创建新对象


顺便问一下,你的向量是什么类型的,你到底想要实现什么?如果将A到Z类型的对象存储在单个向量中,它可能在某个时间点遭受对象切片。

一个有意义的用法是

A &subclassref = vector[0]);
在上面的行中,不创建新对象


顺便问一下,你的向量是什么类型的,你到底想要实现什么?如果将类型A到Z的对象存储在单个向量中,它可能在某个时间点遭受对象切片。

在用例中将指针从一种类型强制转换为另一种类型时,应使用
动态强制转换。
您使用的是
C样式的cast
,我强烈建议您使用
dynamic\u cast
。 因此,您的代码应该如下所示:

if(dynamic_cast<A *>(vector[0]))
    A subclass = *(dynamic_cast<A *>(vector[0]));
if(动态)转换以获取更多信息。

此外,还将帮助您了解更多类型的强制转换。

在用例中将指针从一种类型强制转换为另一种类型时,您应该使用
动态强制转换。
您使用的是
C样式的cast
,我强烈建议您使用
dynamic\u cast
。 因此,您的代码应该如下所示:

if(dynamic_cast<A *>(vector[0]))
    A subclass = *(dynamic_cast<A *>(vector[0]));
if(动态)转换以获取更多信息。

此外,还将帮助您了解更多类型的强制转换。

在用例中将指针从一种类型强制转换为另一种类型时,您应该使用
动态强制转换。
您使用的是
C样式的cast
,我强烈建议您使用
dynamic\u cast
。 因此,您的代码应该如下所示:

if(dynamic_cast<A *>(vector[0]))
    A subclass = *(dynamic_cast<A *>(vector[0]));
if(动态)转换以获取更多信息。

此外,还将帮助您了解更多类型的强制转换。

在用例中将指针从一种类型强制转换为另一种类型时,您应该使用
动态强制转换。
您使用的是
C样式的cast
,我强烈建议您使用
dynamic\u cast
。 因此,您的代码应该如下所示:

if(dynamic_cast<A *>(vector[0]))
    A subclass = *(dynamic_cast<A *>(vector[0]));
if(动态)转换以获取更多信息。

此外,它还将帮助您了解更多类型的类型转换。

这个答案可能是错误的,因为我正在猜测您是如何填充
std::vector的

您根本无法将子类的对象放入
std::vector
中。
std::vector
中的所有对象都是
Base
类型的对象。如果您尝试以下操作:

std::vector<Base> myVec;
myVec.push_back(Derived1(...));
std::vector myVec;
myVec.push_back(派生1(…);
您首先构造一个类
Derived1
的对象,该对象随后被拼接到类
Base
的对象中,也就是说,一个类
Base
的新对象是从派生对象复制而来的。只有这个复制构造的基类对象最终出现在
std::vector


如果您想拥有多态对象的
std::vector
,则必须使用指针类型作为模板参数(从而使用
new
分配包含的对象)。

这个答案可能是错误的,因为我猜测您是如何填充
std::vector

您根本无法将子类的对象放入
std::vector
中。
std::vector
中的所有对象都是
Base
类型的对象。如果您尝试以下操作:

std::vector<Base> myVec;
myVec.push_back(Derived1(...));
std::vector myVec;
myVec.push_back(派生1(…);
您首先构造一个类
Derived1
的对象,该对象随后被拼接到类
Base
的对象中,也就是说,一个类
Base
的新对象是从派生对象复制而来的。只有这个复制构造的基类对象最终出现在
std::vector


如果您想拥有多态对象的
std::vector
,则必须使用指针类型作为模板参数(从而使用
new
分配包含的对象)。

这个答案可能是错误的,因为我猜测您是如何填充
std::vector

您根本无法将子类的对象放入
std::vector
中。
std::vector
中的所有对象都是
Base
类型的对象。如果您尝试以下操作:

std::vector<Base> myVec;
myVec.push_back(Derived1(...));
std::vector myVec;
myVec.push_back(派生1(…);
您首先构造一个类
Derived1
的对象,该对象随后被拼接到类
Base
的对象中,也就是说,一个类
Base
的新对象是从派生对象复制而来的。只有这个复制构造的基类对象最终出现在
std::vector


如果您想拥有多态对象的
std::vector
,则必须使用指针类型作为模板参数(从而使用
new
分配包含的对象)。

这个答案可能是错误的,因为我猜测您是如何填充
std::vector

您根本无法将子类的对象放入
std::vector
中。
std::vector
中的所有对象都是
Base
类型的对象。如果您尝试以下操作:

std::vector<Base> myVec;
myVec.push_back(Derived1(...));
std::vector