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 类应该是虚拟的?
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 类应该是虚拟的?
dynamic_cast
工作方式与static_cast
. a 的结果static_cast
始终是一个指针。但是,如果转换不正确(对于给定指针最初不是的类型),则转换的结果是未定义的;指针不一定有效。static_cast
因此,使用;转换为派生类时存在一定程度的不确定性。没有任何机制可以防止你投错东西。
dynamic_cast
如果转换正确,则返回有效指针,如果不正确,则返回空指针。因此,结果在所有情况下都是明确定义的。为了做到这一点,dynamic_cast
必须是动态的。这意味着它必须对指针进行运行时检查,以查看被转换为的类型是否是合法的转换操作。
由于“按使用付费”原则,C++ 禁止对非虚类型进行强制转换:没有虚函数的类型通常不是您通过其基类传递的类型。没有虚拟的继承主要是关于使用现有的实现,而不是专门化函数。即使是像虚拟析构函数这样简单的东西也足够了。
需要做的机器dynamic_cast
是非零的。因此,根据“按使用付费”的原则,只有那些有用的课程才会付费。IE:那些是虚拟的类。
输出将大致如下:
错误 xxxx: 的参数无效
dynamic_cast
。类是非多态类型。
这些类需要是多态的,因为这是dynamic_cast
. 在内部,dynamic_cast
检查虚拟表指针,但这是一个实现细节。
您可以static_cast
在这种情况下使用。
virtual
是多态性的关键。虚函数意味着它可以被派生类“覆盖”,否则类之间没有多态性,只有继承。如果类不是多态的,dynamic_cast
则不能使用。