菱形继承模型
模型对应代码:
#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中成员变量的后面。
新闻热点
疑难解答