博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2011年9月2日

摘要: 最近看了下Inside C++里面讲的对虚继承层次的对象的内存布局,发现在不同编译器实现有所区别。因此,自己动手探索了一下。结果如下:首先,说说GCC的编译器.它实现比较简单,不管是否虚继承,GCC都是将虚表指针在整个继承关系中共享的,不共享的是指向虚基类的指针。class A {int a;virtual ~A(){}};class B:virtual public A{virtual ~B(){}virtual void myfunB(){}};class C:virtual public A{virtual ~C(){}virtual void myfunC(){}};class D:p 阅读全文

posted @ 2011-09-02 11:13 李大嘴 阅读(2294) 评论(0) 推荐(1) 编辑

摘要: 要使用RTTI特性,必须包含<typeinfo>头文件,并且要使用/GR开启运行时信息,在visual studio中打开该项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。单击“C/C++”文件夹。单击“语言”属性页。修改“启用运行时类型信息”属性。在g++中应该是在编译时使用命令/GR即可,(这个本人不是很确定,没实验过)先给一小段代码: class A{public:virtual ~A(){}};class B:public A{}; 一: dynamic_cast强制转换运算符将一个基类的指针或者引用转换为其子类的指针或者引用,其使用方法为:dynamic 阅读全文

posted @ 2011-09-02 11:11 李大嘴 阅读(1336) 评论(0) 推荐(0) 编辑

摘要: 使用dynamic_cast就必须在编译器中启动RTTI,即“运行时期类型识别”。默认情况下编译器是不启动RTTI的。凡是程序中用到了RTTI(比如typeid)都要在编译器中打开RTTI,这样才能正确编译。VC6下启动RTTI:Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infomation(RTTI)选中,或者直接使用/GR编译选项.VS.net2003下启动RTTI:项目->项目属性->C/C++->语言,将“启用运行时类型信息” 选择为“是”。 阅读全文

posted @ 2011-09-02 11:11 李大嘴 阅读(1063) 评论(0) 推荐(1) 编辑