描述:
#include "stdafx.h"
#include "iostream.h"
class AA
{
public:
int naa;
public:
void fa();
AA()
{
naa = 0;
}
virtual AA* printfa()
{
cout<<"class A"<<endl;
return this;
}
};
class BB:public virtual AA
{
public:
int nbb;
public:
BB()
{
nbb = 1;
}
void fb();
virtual void printfb()
{
cout<<"class B"<<endl;
}
};
class CC:public virtual AA
{
public:
int ncc;
public:
CC()
{
ncc = 2;
}
void fc();
virtual void printfc()
{
cout<<"class C"<<endl;
}
};
class BBCC:public BB,public CC
{
public:
int nbbcc;
public:
BBCC()
{
nbbcc = 12;
}
void fbc();
virtual void printfbc()
{
cout<<"class BC"<<endl;
}
};
int main(int argc, char* argv[])
{
AA* aa = new AA;
aa->printfa();
BB* bb = new BB;
bb->printfb();
CC* cc = new CC;
cc->printfc();
BBCC* bbcc = new BBCC;
bbcc->printfbc();
cout<<sizeof(AA)<<endl;
cout<<sizeof(BB)<<endl;
cout<<sizeof(CC)<<endl;
cout<<sizeof(BBCC)<<endl;
return 0;
}
bb和cv为什么占20个空间?
bb的内存布局:
00431B40 30 60 42 00 //应该是个指针
00431B44 34 60 42 00 //应该是个指针
00431B48 01 00 00 00
00431B4C 2C 60 42 00 //应该是个指针
00431B50 00 00 00 00
为什么有3个指针呢?
bbcc的内存布局:
00431AB0 74 60 42 00
00431AB4 8C 60 42 00
00431AB8 01 00 00 00
00431ABC 70 60 42 00
00431AC0 80 60 42 00
00431AC4 02 00 00 00
00431AC8 0C 00 00 00
00431ACC 6C 60 42 00
00431AD0 00 00 00 00
好象有5个指针的,他们是什么呢?
知道的朋友来帮帮我
另外若要调用 AA->fa(); 编译器怎么实现 怎么找fa()的地址?
aa = new AA; 着时候产生this 指针吗?
问题与点多哦!分给的少了点吧! 没办法了 最多只能给100了。
解决方案1:
第一个问题:bb和cc为什么占20个空间?
aa是8个字节,这没有问题,bb是虚拟继承至aa,它除了有一个成员变量,一个虚表指针外,还有一个指向aa相对地址的指针,所以为20字节,cc也是如此。
第2个问题:
00431B40 30 60 42 00 //应该是个指针
00431B44 34 60 42 00 //应该是个指针
00431B48 01 00 00 00
00431B4C 2C 60 42 00 //应该是个指针
00431B50 00 00 0
通过上面的回答,你该知道了吧
关于this指针,调用函数编译器就会为你在函数的参数中加上一个this指针的
第3个问题:
bbcc的内存布局:
00431AB0 74 60 42 00
00431AB4 8C 60 42 00
00431AB8 01 00 00 00
00431ABC 70 60 42 00
00431AC0 80 60 42 00
00431AC4 02 00 00 00
00431AC8 0C 00 00 00
00431ACC 6C 60 42 00
00431AD0 00 00 00 00
5个指针分别是3个虚表指针,还有2个指针指向的是aa的基地址
非虚函数并非运行时找地址,而是编译的时候编译器就指定了相对地址。
解决方案3:mark
解决方案4:mark 一个,顶
解决方案5:aa是AA类型,所以直接传对象地址,翻译成c的写法就是AA_fa(aa);如果是bb->fa()的话,就是AA_fa(bb->getAA());这样的过程。虚拟继承的类型转换是运行期计算的。
解决方案6: C++对象模型一书里对此有详细解释,另外各家编译器厂商实现也不尽相同。
bbcc里的五个指针分别是三个AA、BB、CC的虚表指针,两个将BB、CC类转换为AA的偏移指针。
哦
那我就接分了哈