3.4继承与Data Member
只要继承不要多态
测试源码
class Concrete1{
public:
// ...
private:
int val;
char bit1;
};
class Concrete2:public Concrete1{
public:
// ...
private:
char bit2;
};
class Concrete3:public Concrete2{
public:
// ...
private:
char bit3;
};
对于此例子,使用VC++编译,程序运行结果与书中讨论相符,sizeof(Concrete3)为16。使用GCC编译,结果不符,sizeof(Concrete3)为8。
可见,gcc在这里进行了特殊的优化。真正涉及到类似问题,不能轻易下结论,不同编译器可能有所不同。
如果大家知道GCC做了什么样的优化,请给我留言啊。我个人认为两个编译器提供的默认operator=函数可能行为不同。
加上多态
测试源码
#include#include #include using namespace std; class B{ public: virtual void test0(){ cout<<"B test0"<
1.GCC和VC++均把vptr放置在对象的头部
2.vptr指向的virtual table里有一个slot,用以支持runtime type identification,但GCC和VC++并没有把slot放置在下标为0的位置。
虚继承
VC++使用虚继承对象尺寸增加一个指针大小,使用virtual base class table技术,引入一种新型指针。
GCC引入虚继承对象尺寸并没有增大,猜测有可能使用virtual function table中放置virtual base class的offset技术,复用vptr,赋予vptr和vtbl双重任务。