C++ 多重继承的实现

类别:编程语言 点击:0 评论:0 推荐:

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

以后再添加,欢迎指正!

本文地址:http://com.8s8s.com/it/it22484.htm