单继承时虚函数:http://blog.youkuaiyun.com/qq_35116353/article/details/61951720
多继承下的虚函数是怎样的呢?
没有虚函数覆盖时:
运行下面程序
#include <iostream>
using namespace std;
typedef void (* pFun)(void);
class Base1{
public:
virtual void e(){ cout<<"B1:: e() "<<endl;}
virtual void f(){ cout<<"B1:: f() "<<endl;}
virtual void g(){ cout<<"B1:: g() "<<endl;}
};
class Base2{
public:
virtual void h(){ cout<<"B2:: h() "<<endl;}
virtual void i(){ cout<<"B2:: i() "<<endl;}
};
class Base3{
public:
virtual void j(){ cout<<"B3:: j() "<<endl;}
};
class Derive: public Base1,Base2,Base3{
public:
Derive() {cout<<"sizeof(Derive) is : "<<sizeof(Derive)<<endl;}
virtual void k(){cout<<"D::k()"<<endl;}
};
int main()
{
Base1 base1;
Base2 base2;
Base3 base3;
Derive derive;
for (int i=0; i<4; i++)
{
pFun fun = (pFun)* ((int*)*(int*)&derive + i);
fun();
}
return 0;
}
查看子类实例
第一个虚表的内容是基类的三个虚函数以及子类的虚函数,
第二个虚表的内容是第二个基类虚函数地址,
第三个虚表的内容是第三个基类虚函数的地址。
如果改为
class Derive: public Base3, Base2,Base1{
};
第一个虚表就是Base3的虚函数加上子类的虚函数;
可以总结多继承中每个基类都有自己的虚表,子类虚函数没有覆盖基类的虚函数时,子类的虚函数加在第一个基类(按继承顺序)虚函数的后面
有子类的虚函数覆盖时:
这里Base1的f()和Base3 的j()函数被覆盖
#include <iostream>
using namespace std;
typedef void (* pFun)(void);
class Base1{
public:
virtual void e(){ cout<<"B1:: e() "<<endl;}
virtual void f(){ cout<<"B1:: f() "<<endl;}
virtual void g(){ cout<<"B1:: g() "<<endl;}
};
class Base2{
public:
virtual void h(){ cout<<"B2:: h() "<<endl;}
virtual void i(){ cout<<"B2:: i() "<<endl;}
};
class Base3{
public:
virtual void j(){ cout<<"B3:: j() "<<endl;}
};
class Derive: public Base1,Base2,Base3{
public:
Derive() {cout<<"sizeof(Derive) is : "<<sizeof(Derive)<<endl;}
virtual void f(){cout<<"D::f()"<<endl;}
virtual void k(){cout<<"D::k()"<<endl;}
virtual void j(){cout<<"D::j()"<<endl;}
};
int main()
{
Base1 base1;
Base2 base2;
Base3 base3;
Derive derive;
for (int i=0; i<1; i++)
{
pFun fun = (pFun)* ((int*)*((int*)&derive+2) + i);
fun();
}
return 0;
}
子类实例有三个虚表,分别打印
子类有每个基类的虚表(按照继承顺序排列),并且都遵循有覆盖的单继承的虚表规则,子类没有覆盖基类的虚函数
会按照声明顺序加在第一个虚表的后面。