C++ 多重继承的实现

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

C++ 多重继承的实现

都说多重继承有很多缺点,但我一直搞不清楚是指的哪些。今天仔细研究了C++中多重继承的实现机制,发现其中的巧妙之处。先看代码:

class G

{

public:

int i;

virtual void T(){};

virtual void H(){};

};

class A:public G

{

public:

A()

{

i=1;

}

virtual void T(){cout << "A::T\n"<<i;}

};

class B:public G

{

public:

public:

B()

{

i=2;

}

virtual void T(){cout << "B::T\n"<<i;}

virtual void H(){};

};

class C:public B,A

{

virtual void T(){cout << "C::T\n";}

virtual void H(){cout << "C::H\n";};

};

void fun()

{

cout << "SB\n";

}

int add[10]={(int)&fun};

int d[10]={(int)&add,4,5,6,7,8,9};

int _tmain(int argc, _TCHAR* argv[])

{

C u;

C* i=&u;

G* a=(A*)&u;

G* b=(B*)&u; //此处观察局部变量

}

总结如下:

1、 当一个类有多个父类时,每个父类在内存中依次排列,然后该类自己的成员。

2、 每一个父类的镜像中,都包含有独立的虚函数表

3、 当把子类的指针Upcast的时候,两种Upcast的方式得到的结果分别指向各自的父类镜像

4、 当两个父类重载的虚函数不同时,会使用Thunk机制,也就是说,虚函数表中的函数指针并不指向实际的虚函数,而是指向一小段代码。在这一小段代码中,会修改This指针(ECX寄存器),使之指向合适的父类镜像,然后再跳转到实际的虚函数体。

5、 当不使用虚继承时,共同基类的成员对象,在子类中会有独立两分(从两个父类各自继承了一份)。

6、 当使用虚继承时,共同基类的成员对象也会在虚函数表中记录,访问它必须先查找虚函数表。

以后再添加,欢迎指正!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航