菱形继承
-
菱形继承带来的问题
最底层子类从基类中继承的成员变量冗余、重复。
最底层子类访问基类成员变量有二义性。
-
虚继承
解决多继承属性之间的重复问题
虚函数是为了实现多态
#include <iostream>
using namespace std;
struct Person
{
int m_age;
//virtual void run() = 0;
void fun() {
cout << "Person::fun()" << endl;
}
};
struct Student: Person
{
int m_score;
};
struct Worker: Person
{
int salary;
};
struct UnderGraduate:Student,Worker
{
int m_grade;
void run() {
cout << "UnderGraduate::run()" << endl;
}
};
int main() {
UnderGraduate gra;
//无法直接调用fun()
gra.Worker::fun();
gra.Student::fun();
cout << sizeof(gra) << endl;
return 0;
}
UnderGraduate gra;
gra.Worker::fun();
lea ecx,[ebp-14h]
call Person::fun (01C14ABh)
//两次传入的this指针不一样
gra.Student::fun();
lea ecx,[gra]
call Person::fun (01C14ABh)
//使用虚继承后两次传入的this一样
gra.Worker::fun();
mov eax,dword ptr [gra]
mov ecx,dword ptr [eax+4]
lea ecx,gra[ecx]
call Person::fun (03414ABh)
gra.Student::fun();
mov eax,dword ptr [gra]
mov ecx,dword ptr [eax+4]
lea ecx,gra[ecx]
call Person::fun (03414ABh)