如下,a 12字节,b8字节如果a,b均只继承BASE1,BASE2,写法不变,则a 8字节,b 4字节,
b的4字节很容易理解,按照书上的解释,会有一个虚基类表指针,但问题是a又多出了4字节。
而且每多出一个这样的虚继承,子类就会大4字节,貌似在子类中保存了虚基类指针,但书上明明白白说的不是这样的。
如果给BASE1添加一个int成员,则b变成8字节,一个虚表指针,一个int,而a仍然是8字节,这样说明并不是
保存的虚基类指针,而是类似占位符一样的。在linux上就没有这个问题,a,b都是4字节,很好,很和谐。我知道M$的编译器和别家不同,但我就是没想明白
小盖是怎么做的。
#include <iostream>
using namespace std;class BASE1
{
public:
};
class BASE2
{
public:};
class BASE3
{
public:};
class BASE4
{};class a : virtual public BASE1,virtual public BASE2,virtual public BASE3
{
public:
a(){};
~a(){};
};
class b: public BASE1,virtual public BASE2,virtual public BASE3
{
public:
b(){};
~b(){};
};
int main(int argc, char* argv[])
{
a e1;
b e2; cout<<&e1<<endl;
cout<<&e2<<endl; cout<<sizeof(e1)<<endl;
cout<<sizeof(e2)<<endl; return 0;
}
b的4字节很容易理解,按照书上的解释,会有一个虚基类表指针,但问题是a又多出了4字节。
而且每多出一个这样的虚继承,子类就会大4字节,貌似在子类中保存了虚基类指针,但书上明明白白说的不是这样的。
如果给BASE1添加一个int成员,则b变成8字节,一个虚表指针,一个int,而a仍然是8字节,这样说明并不是
保存的虚基类指针,而是类似占位符一样的。在linux上就没有这个问题,a,b都是4字节,很好,很和谐。我知道M$的编译器和别家不同,但我就是没想明白
小盖是怎么做的。
#include <iostream>
using namespace std;class BASE1
{
public:
};
class BASE2
{
public:};
class BASE3
{
public:};
class BASE4
{};class a : virtual public BASE1,virtual public BASE2,virtual public BASE3
{
public:
a(){};
~a(){};
};
class b: public BASE1,virtual public BASE2,virtual public BASE3
{
public:
b(){};
~b(){};
};
int main(int argc, char* argv[])
{
a e1;
b e2; cout<<&e1<<endl;
cout<<&e2<<endl; cout<<sizeof(e1)<<endl;
cout<<sizeof(e2)<<endl; return 0;
}
解决方案 »
- Slider Control怎么处理滑动消息
- 请问Dialog下怎么显示位图,为什么这样不行
- 如何得到默认打印机?
- 请问怎样在无绑定模式下使用DBGrid?
- 请问哪有下MS Excel 2000 语言参考手册得
- 请问有没有vc方面关于流技术方面的书?
- 高分求救:绘图问题,高手请进(怎么画立体矩形?有没有现成的函数?或者怎么填充平行四边形)
- 关于查找文件的递归算法
- 哪里有"Windows网络编程技术"的电子书(中文版)可以下载?马上给分!!
- 如何用VC实现显示桌面,就像WINDOWS的"显示桌面"工具一样
- 怎样可以实现类似vbscript里的eval()和execute()的功能?
- 像windows那样的 浏览 对话框如何弹出
所以各个编译器的实现均有差别.尤其是虚拟继承.
你可以再试试Borland C++ Builder和Intel C++的结果.深入C++对象模型 只是一种参考,不能作为依据.