菱形继承模型:
菱形继承模型代码演示:
#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;
};
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;
}
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;
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;
};
{
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;
}
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;
}