ran*_*111 -1 c++ virtual dynamic-cast
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;
}
Run Code Online (Sandbox Code Playgroud)
如果你想进行动态演员,为什么A类应该是虚拟的呢?
dynamic_cast与...有所不同static_cast.a的结果static_cast总是一个指针.但是,如果强制转换不正确(对于给定指针最初不是的类型),那么强制转换的结果是未定义的; 指针不一定有效.因此,在使用派生类进行转换时存在一定程度的不确定性static_cast; 没有机制可以阻止你转向错误的东西.
dynamic_cast如果强制转换正确则返回有效指针,如果不正确则返回空指针.因此,结果在所有情况下都是明确定义的.为了做到这一点,dynamic_cast必须是动态的.这意味着它必须对指针进行运行时检查,以查看正在转换为的类型是否为合法的转换操作.
C++禁止为非虚拟类型转换,因为"为你使用的东西付费"原则:没有虚函数的类型通常不是你的基类传递的类型.没有虚拟的继承主要是关于使用现有实现,而不是关于专门化功能.即使像虚拟析构函数这样简单的东西就足够了.
需要做的机器dynamic_cast是非零的.因此,在"为你使用的东西付费"的原则下,只有那些有用的课程才能为它们付出代价.IE:那些虚拟的类.
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |