error C2683: “dynamic_cast”:“XXX”不是多态类型

来源:http://blog.csdn.net/win2ks/article/details/2312168

是的是的,使用dynamic_cast会引发效率上的担忧,但是有时候这是必要的,而有时候,这是必须的,在自己不预加运行时识别策略的时候,如果要使用运行时处理机制,通过dynamic_cast判断指针或检测异常是一个非常直观的想法,而且不少时候这也很有效。

但对dynamic_cast理解不够深入会遇到这样的麻烦:

class  Bast
... {

}
;

class  Test    : public  Bast
... {
    
}
;

int  _tmain( int  argc, _TCHAR *  argv[])
... {
    Bast
*    bt    = new Test();
    Test
*    tt    = dynamic_cast<Test*>(bt);
    
return 0;
}

编译器抱怨说error C2683: “dynamic_cast”:“Bast”不是多态类型。

在我的编译器上调试这种情况发现,子类里明确包含了基类,但是一个基类指针指向子类的时候,无法识别出来子类的附加信息。也就是说,在没有虚函数参与的时候,并没有神秘的vtable存在,c++对象模型里似乎也提到了(我记不清是不是这本书了,sorry)编译器实现虚函数靠的是vtable策略,但是这话的深层含义却是如果没有虚函数存在,编译器没有必要浪费空间实现一个虚指针、vtable(我开始脊背发凉了)。看来大师的每一句话都要仔细研究。

当把基类改成这样:

class  Bast
... {
    
virtual    void    dosomething()...{}
}
;

调试发现任何时候,虚指针都存在,也就是说,运行时识别技术可以生效。

也就是说,如果希望使用dynamic_cast技术或者你不得不使用dynamic_cast技术,那应该确保你在多态类上使用它(也就是你的继承体系里有虚函数)。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值