菱形继承模型代码演示:#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; };typedef void(*pfun)();void printfBase(pfun *_ppfun){ int i = 0; for (i = 0; _ppfun[i] != NULL; i++) { _ppfun[i](); }}void test(){ Deriver d; printfBase((pfun*)*((int*)(&d))); printfBase((pfun*)*((int*)(&d)+3));}int main(){ test(); system("pause"); return 0;}此时根据监视窗口可观察到,Deriver的虚函数存放在第一个虚表的末尾处。菱形虚拟继承模型:
代码实现如下:#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: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() :_b3(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() :_d4(4) { } virtual void fun1() { cout << "Deriver::fun1()" << endl; } virtual void fun4() { cout << "Deriver::fun4()" << endl; } private: int _d4; };};typedef void(*pfun)();void printfBase(pfun *_ppfun){int i = 0;for (i = 0; i<2&&_ppfun[i] != NULL; i++){_ppfun[i]();}}void test(){Deriver d;printfBase((pfun*)*((int*)(&d)));printfBase((pfun*)*((int*)(&d)+3));printfBase((pfun*)*((int*)(&d)+8));}int main(){test();system("pause");return 0;}新闻热点
疑难解答