C++ 在动态强制转换c+方面有问题+;
我试图编写一个简单的程序,作为在基类对象和派生类对象之间来回转换的演示。这是我的密码C++ 在动态强制转换c+方面有问题+;,c++,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&>(a
#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);
}
#包括“stdafx.h”
#包括
使用名称空间std;
甲级
{
虚拟void hi(){}
};
b类:公共a
{
};
int main()
{
a abs=b();
b&bbs=动态铸造(abs);
虽然(正确);
}
<代码>编译好,但是当我运行它时,我在类Test.Exe中的“0x75 C4C41F”中得到了一个“未处理的异常:微软C++异常:STD::BADYCAST在内存位置0x03DF908。”我不知道我做错了什么。有人能给我解释一下为什么这不起作用。你不能动态投射对象。只能强制转换引用或指针 换成
a* abs = new b();
b* bbs = dynamic_cast<b*>(abs);
a*abs=newb();
b*bbs=动态抛投(abs);
或
obj_b=b();
a&abs=obj_b;
b&bbs=动态铸造(abs);
您的代码有错误abs
是类型为a
的对象,是从b
的匿名实例复制而成的。您需要的是ab
的实例,并将abs
作为对a
的引用
b bbs;
a &abs = bbs;
b &bbr = dynamic_cast<b&>(abs);
bbs;
a&abs=bbs;
b&bbr=动态铸造(abs);
你应该有一个虚拟析构函数,在<代码> A<代码>中,因为你想使用多态性(尽管这个例子不需要)。
< p>你遇到了一个C++问题,叫做“切片”。基本上,abs
是一个a
,而不是一个b
,因为
a abs = b();
b
对象b
的a
构造函数,并查找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();
同样,不确定这是否是您在本例中所需要的,但它确实存在。类似的内容可能就是您试图做的:
#include <iostream>
class a
{
public:
virtual void hi(){}
virtual ~a() {}
};
class b : public a
{
};
int main()
{
b b_obj;
a& a_ref_to_b = b_obj;
b& b_ref_to_b = dynamic_cast<b&>(a_ref_to_b);
return 0;
}
#包括
甲级
{
公众:
虚拟void hi(){}
虚拟~a(){}
};
b类:公共a
{
};
int main()
{
b_obj;
a&a参考至b=b;
b&b_-ref_-to_-b=动态演员阵容(a_-ref_-to_-b);
返回0;
}
abs
是a
,而不是b
。因此,您不能将其动态转换为任何其他内容;如果你坚持这条规则,这样的废话就永远不会被编译。你遇到了切片问题…关于:“在基类对象和派生类对象之间来回转换”-代码不会在对象类型之间转换;它将引用强制转换为对象。别把这两个人搞混了;如果你这样做了,差异会在以后影响你。这要看情况而定。只要确保这不会是一场灾难
#include <iostream>
class a
{
public:
virtual void hi(){}
virtual ~a() {}
};
class b : public a
{
};
int main()
{
b b_obj;
a& a_ref_to_b = b_obj;
b& b_ref_to_b = dynamic_cast<b&>(a_ref_to_b);
return 0;
}