在网上查找关于虚函数的资料时,看到了这样一部分内容,记录下来,感谢原作者。
-
#include "stdafx.h"
-
#include <iostream>
-
using namespace std;
-
-
class Base1
-
{
-
public:
-
//虚函数定义
-
virtual void f(){cout << "Base1::f" << endl;}
-
virtual void g(){cout << "Base1::g" << endl;}
-
virtual void h(){cout << "Base1::h" << endl;}
-
};
-
-
class Base2
-
{
-
public:
-
//虚函数定义
-
virtual void f(){cout << "Base2::f" << endl;}
-
virtual void g(){cout << "Base2::g" << endl;}
-
virtual void h(){cout << "Base2::h" << endl;}
-
};
-
-
class Base3
-
{
-
public:
-
virtual void f(){cout << "Base3::f" << endl;}
-
virtual void g(){cout << "Base3::g" << endl;}
-
virtual void h(){cout << "Base3::h" << endl;}
-
};
-
-
//多继承的情况——无虚继承覆盖
-
class Derive:public Base1, public Base2, public Base3
-
{
-
public:
-
//虚函数定义
-
virtual void f1(){cout << "Derive::f1" << endl;}
-
virtual void g1(){cout << "Derive::g1" << endl;}
-
};
-
-
int main()
-
{
-
typedef void (*fun)(void);
-
-
cout << "多重继承时的情况(无虚函数覆盖):" << endl;
-
Derive dobj;
-
cout << "Derive类的第一个虚函数表地址:" << (int *)(&dobj) << endl;
-
cout << "依次调用三个虚函数表中的虚函数:" << endl;
-
cout << "第一个虚函数表中的虚函数:" << endl;
-
fun pfun = NULL;
-
pfun = (fun)*( (int *)*( (int *)(&dobj) ) );
-
pfun();
-
pfun = (fun)*( (int *)*( (int *)(&dobj) ) + 1);
-
pfun();
-
pfun = (fun)*( (int *)*( (int *)(&dobj) ) + 2);
-
pfun();
-
pfun = (fun)*( (int *)*( (int*)(&dobj) ) + 3);
-
pfun();
-
pfun = (fun)*( (int *)*( (int*)(&dobj) ) + 4);
-
pfun();
-
//
-
cout << "第二个虚函数表中的虚函数:" << endl;
-
pfun = (fun)*((int *)*((int*)(&dobj)+ 1));
-
pfun();
-
pfun = (fun)*((int *)*((int*)(&dobj)+ 1) + 1);
-
pfun();
-
pfun = (fun)*((int *)*((int*)(&dobj)+ 1) + 2);
-
pfun();
-
//
-
cout << "第三个虚函数表中的虚函数:" << endl;
-
pfun = (fun)*((int *)*((int*)(&dobj )+ 2));
-
pfun();
-
pfun = (fun)*((int *)*((int*)(&dobj )+ 2) + 1);
-
pfun();
-
pfun = (fun)*((int *)*((int*)(&dobj )+ 2) + 2);
-
pfun();
-
-
return 0;
- }

上面代码的类继承关系如下所示(多重继承无虚函数覆盖)。

子类虚函数表的结构如下所示。

上面的程序就是验证多重继承无虚函数覆盖时,子类的对象模型。