菱形继承模型
模型对应代码:
#include<iostream>
using namespace std;
class Base
{
public:
Base()
:_b1(1){}
virtual void fun1()
{
cout << "Base1::fun1()" << endl;
}
virtual void fun2()
{
cout << "Base1::fun2()" << endl;
}
private:
int _b1;
};
class Base2 :public Base
{
public:
Base2()
:_b2(1){}
virtual void fun1()
{
cout << "Base2::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base2::fun2()" << endl;
}
private:
int _b2;
};
class Base3 :public Base
{
public:
Base3()
:_b3(1){}
virtual void fun1()
{
cout << "Base3::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base3::fun2()" << endl;
}
private:
int _b3;
};
class Deriver :public Base2, public Base3
{
public:
Deriver()
:_d3(3){}
virtual void fun1()
{
cout << "Deriver::fun1()" << endl;
}
virtual void fun4()
{
cout << "Deriver::fun3()" << endl;
}
private:
int _d3;
};
根据监视窗口及运行结果可以看出Deriver的虚函数存放在第一个虚函数表的最后。
菱形虚拟继承
菱形虚拟继承模型
class Base
{
public:
Base()
:_b1(1){}
virtual void fun1()
{
cout << "Base1::fun1()" << endl;
}
virtual void fun2()
{
cout << "Base1::fun2()" << endl;
}
private:
int _b1;
};
class Base2:virtual public Base
{
public:
Base2()
:_b2(2){}
virtual void fun1()
{
cout << "Base2::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base2::fun2()" << endl;
}
private:
int _b2;
};
class Base3:virtual public Base
{
public:
Base3()
:_b4(3){}
virtual void fun1()
{
cout << "Base3::fun1()" << endl;
}
virtual void fun3()
{
cout << "Base3::fun2()" << endl;
}
private:
int _b3;
};
class Deriver:public Base2,public Base3
{
public:
Deriver()
:_d3(4){}
virtual void fun1()
{
cout << "Deriver::fun1()" << endl;
}
virtual void fun4()
{
cout << "Deriver::fun4()" << endl;
}
private:
int _d4;
};
由于是虚继承所以Base2和Base3中的Base _vfptr存放的是偏移量的地址,根据偏移量可以找到Base。且存放在Deriver中成员变量的后面。