error C2683: “dynamic_cast”:“XXX”不是多态类型
来源:互联网 发布:mac中断进程 编辑:程序博客网 时间:2024/06/05 09:48
来源: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;
}
...{
};
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()...{}
};
...{
virtual void dosomething()...{}
};
调试发现任何时候,虚指针都存在,也就是说,运行时识别技术可以生效。
也就是说,如果希望使用dynamic_cast技术或者你不得不使用dynamic_cast技术,那应该确保你在多态类上使用它(也就是你的继承体系里有虚函数)。
- error C2683: “dynamic_cast”:“XXX”不是多态类型
- error C2683: “dynamic_cast”:“XXX”不是多态类型
- error C2683: “dynamic_cast”:“XXX”不是多态类型。dynamic_cast与虚函数
- error C2011: “XXX”:“class”类型重定义
- error C2011: “XXX”:“class”类型重定义
- error C2011: “XXX”:“class”类型重定义
- error C2275: “XXX”: 将此类型用作表达式非法
- c++类型转换dynamic_cast
- Error:(13, 8) 错误: xxx不是抽象的, 并且未覆盖xxx中的抽象方法onBindViewHolder(BaseSimpleRecyclerAdapter.ViewHolder,int)
- C++类型转化分析:动态态转换->dynamic_cast
- flex 1046: 找不到类型,或者它不是编译时常数: xxx
- 类型转换static_cast,reinterpret_cast,dynamic_cast
- c++类型转换之dynamic_cast
- C++类型转换dynamic_cast解析
- C++强制类型转换 dynamic_cast
- C++类型转换之dynamic_cast
- dynamic_cast 动态强制类型转换
- VS编译 error C2275: “XXX”: 将此类型用作表达式非法天天向上
- 字符串匹配(String matching)[No. 76]
- Debian6 无线驱动安装
- OO设计原则 — Single Responsibility Principle:OO设计的SRP单一职责原则
- [每天一题]判断字符串里否是都是独一无二的字符(不要用额外空间)
- 未来居民健康档案编码以身份证号识别
- error C2683: “dynamic_cast”:“XXX”不是多态类型
- [每天一题]删除字符串中的重复字符(不要使用额外空间)
- vc9 不时出现 Microsoft Incremental Linker已停止工作
- 3D旋转的球
- 学古筝
- 被误解的C++_汉尼拔
- ORACLE RAC的搭建
- 敏捷的项目启动-尽早启动!
- Just enough(刚刚好)的软件开发文档什么样?