class A
{
};
class B:public A
{
};
int main()
{
A a;
B b;
A *ap = &b;
B *bp = dynamic_cast<B*>(ap);
if(bp!= NULL)
cout<<"Pass"<<endl;
else
cout<<"Fail"<<endl;
return 0;
}
如果你想进行动态演员,为什么A类应该是虚拟的呢?
答案 0 :(得分:6)
dynamic_cast
与static_cast
的工作方式不同。 static_cast
的结果始终是指针。但是,如果强制转换不正确(对于给定指针最初不是的类型),那么强制转换的结果是未定义的;指针不一定有效。因此,在使用static_cast
转换为派生类时存在一定程度的不确定性;没有任何机制可以防止你误入歧途。
dynamic_cast
将返回有效指针,如果不正确,则返回空指针。因此,结果在所有情况下都是明确定义的。为此,dynamic_cast
必须动态。这意味着它必须对指针进行运行时检查,以查看正在转换为的类型是否为合法的转换操作。
C ++禁止非虚拟类型的转换,因为“为你使用的东西付费”原则:没有虚函数的类型通常不是你的基类传递的类型。没有虚拟的继承主要是关于使用现有实现,而不是关于专门化功能。即使像虚拟析构函数这样简单的东西就足够了。
dynamic_cast
所需的机制不为零。因此,在“为你使用的东西付费”原则下,只有那些有用的课程才能为它们付费。 IE:那些虚拟的类。
答案 1 :(得分:1)
输出结果如下:
错误xxxx:
dynamic_cast
的参数无效。类是非多态类型。
这些类需要是多态的,因为这是dynamic_cast
的规范。在内部,dynamic_cast
检查虚拟表指针,但这是一个实现细节。
在这种情况下,您可以使用static_cast
。
答案 2 :(得分:0)
virtual
是多态的关键。虚函数意味着它可以被派生类“覆盖”,否则类之间不存在多态,只有继承。如果类不是多态的,则不能使用dynamic_cast
。