参考于上一篇虚函数,多重继承也分为有无虚函数覆盖的问题; 在虚表存在着不同的情况
多重继承(无虚函数覆盖)
参考虚表:
这里子类的虚函数地址,添加到第一个继承的父类的虚表里面 此外 虚表中的 . 区域代表是否 还存在虚表 1 表示还存在虚表,0则表示最后一个虚表;
代码如下:
#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 Derived:public Base2,public Base1,public Base3{
public:
virtual void f1()
{
cout << " Derived:: f1() " << endl;
}
virtual void g1()
{
cout << "Derived:: g1() " << endl;
}
};
typedef void(*Fun)(void);//函数指针 存放地址 知道地址 调用函数
int main()
{
Derived d;
Fun pFun = NULL;
int** pVtab = (int**)(&d);
//Base1's virtual table
pFun = (Fun)pVtab[0][0];
pFun();
pFun = (Fun)pVtab[0][1];
pFun();
pFun = (Fun)pVtab[0][2];
pFun();
pFun = (Fun)pVtab[0][3];
pFun();
pFun = (Fun)pVtab[0][4];
pFun();
cout << pFun << endl;
//Base2's virtual table
pFun = (Fun)pVtab[1][0];
pFun();
pFun = (Fun)pVtab[1][1];
pFun();
pFun = (Fun)pVtab[1][2];
pFun();
pFun = (Fun)pVtab[1][3];
cout << pFun << endl;
//Base3's virtual table
pFun = (Fun)pVtab[2][0];
pFun();
pFun = (Fun)pVtab[2][1];
pFun();
pFun = (Fun)pVtab[2][2];
pFun();
pFun = (Fun)pVtab[2][3];
cout << pFun << endl;
return 0;
}
输出的结果 对应于前面的 虚表:先继承Base2 先输出(继承顺序)
有虚函数的覆盖:
此时对应的虚表:
测试代码:
#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 Derived:public Base2,public Base1,public Base3{
public:
virtual void f()
{
cout << " Derived:: f1() " << endl;
}
virtual void g1()
{
cout << "Derived:: g1() " << endl;
}
};
typedef void(*Fun)(void);//函数指针 存放地址 知道地址 调用函数
int main()
{
Derived d;
Fun pFun = NULL;
int** pVtab = (int**)(&d);
//Base1's virtual table
pFun = (Fun)pVtab[0][0];
pFun();
pFun = (Fun)pVtab[0][1];
pFun();
pFun = (Fun)pVtab[0][2];
pFun();
pFun = (Fun)pVtab[0][3];
pFun();
pFun = (Fun)pVtab[0][4];
//pFun();
cout << pFun << endl;
//Base2's virtual table
pFun = (Fun)pVtab[1][0];
pFun();
pFun = (Fun)pVtab[1][1];
pFun();
pFun = (Fun)pVtab[1][2];
pFun();
pFun = (Fun)pVtab[1][3];
cout << pFun << endl;
//Base3's virtual table
pFun = (Fun)pVtab[2][0];
pFun();
pFun = (Fun)pVtab[2][1];
pFun();
pFun = (Fun)pVtab[2][2];
pFun();
pFun = (Fun)pVtab[2][3];
cout << pFun << endl;
return 0;
}
运行结果 如下:
父类的f()函数的位置被子类的f()覆盖。对应于上面的虚表;