我正在尝试编写一个简单的程序,作为在基类对象和派生类对象之间来回转换的演示.这是我的代码
#include "stdafx.h"
#include <iostream>
using namespace std;
class a
{
virtual void hi(){}
};
class b : public a
{
};
int main()
{
a abs = b();
b& bbs = dynamic_cast<b&>(abs);
while(true);
}
Run Code Online (Sandbox Code Playgroud)
代码编译得很好,但是当我运行它时,我在类Tests.exe中得到"0x75C4C41F处的未处理异常:Microsoft C++异常:std :: bad_cast在内存位置0x003DF908." 我看不出我做错了什么.任何人都可以向我解释为什么这不起作用.
您遇到了一个名为"切片"的C++问题.基本上,abs是一个a,而不是一个b,因为声明
a abs = b();
Run Code Online (Sandbox Code Playgroud)
b对象.a采用一个构造函数b,并且发现对于拷贝构造a(基于隐式转换从b至a).b对象转换为a(通过丢弃特定于的部分b)并将其传递给复制构造函数a.如果您需要以多态方式复制对象(可能是您实际代码中实际需要的对象),那么执行此操作的典型方法是执行以下操作:
class a
{
public:
virtual a *clone() { return new a(*this); }
};
class b
{
virtual a *clone() { return new b(*this); }
};
b my_b;
a *abs = my_b.clone();
Run Code Online (Sandbox Code Playgroud)
再次,不确定这是否是你在这种情况下所需要的,但它确实存在.