菱形繼承模型
模型對應代碼:
#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中成員變量的后面。
新聞熱點
疑難解答