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