为什么要有虚基类表。因为它是共享的,运行时会调整指针所指向的地址
BB *pp;
pp = &dd(dd是一个派生类)
pp->bb_;
pp在运行时就会自动指向一块内存
和dd的地址是不一样的
B2 *p2;
p2 = ⅆ
p2->bb_;
//p2会自动跳转到它的位置,然后查找虚基类表。
#include <iostream>
using namespace std;
class BB
{
public:
virtual void vfbb()
{
cout<<"BB::vfbb"<<endl;
}
virtual void vfbb2()
{
cout<<"BB::vfbb2"<<endl;
}
int bb_;
};
class B1 : virtual public BB
{
public:
virtual void vfb1()
{
cout<<"B1::vfb1"<<endl;
}
int b1_;
};
class B2 : virtual public BB
{
public:
virtual void vfb2()
{
cout<<"B2::vfb2"<<endl;
}
int b2_;
};
class DD : public B1, public B2
{
public:
virtual void vfdd()
{
cout<<"DD::vfdd"<<endl;
}
int dd_;
};
typedef void (*FUNC)();
int main(void)
{
cout<<sizeof(BB)<<endl;
cout<<sizeof(B1)<<endl;
cout<<sizeof(DD)<<endl;
BB bb;
long** p;
p = (long**)&bb;
FUNC fun;
fun = (FUNC)p[0][0];
fun();
fun = (FUNC)p[0][1];
fun();
cout<<endl;
B1 b1;
p = (long**)&b1;
fun = (FUNC)p[0][0];
fun();
fun = (FUNC)p[3][0];
fun();
fun = (FUNC)p[3][1];
fun();
cout<<p[1][0]<<endl;
cout<<p[1][1]<<endl;
cout<<endl;
DD dd;
p = (long**)ⅆ
fun = (FUNC)p[0][0];
fun();
fun = (FUNC)p[3][0];
fun();
fun = (FUNC)p[7][0];
fun();
fun = (FUNC)p[7][1];
fun();
cout<<p[1][0]<<endl;
cout<<p[1][1]<<endl;
cout<<p[4][0]<<endl;
cout<<p[4][1]<<endl;
return 0;
}
类大小计算遵循前面学过的结构体对齐原则
类的大小与数据成员有关与成员函数无关
类的大小与静态数据成员无关
虚继承对类的大小的影响
虚函数对类的大小的影响