动态转换c ++有问题

Pop*_*lop 2 c++

我正在尝试编写一个简单的程序,作为在基类对象和派生类对象之间来回转换的演示.这是我的代码

#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." 我看不出我做错了什么.任何人都可以向我解释为什么这不起作用.

Ben*_* S. 6

您遇到了一个名为"切片"的C++问题.基本上,abs是一个a,而不是一个b,因为声明

a abs = b();
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个新b对象.
  2. 寻找一个a采用一个构造函数b,并且发现对于拷贝构造a(基于隐式转换从ba).
  3. 将新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)

再次,不确定这是否是你在这种情况下所需要的,但它确实存在.