下面这个函数的输出结果是什么?
#include<iostream>
using namespace std;
class A // 4+4 = 8
{
public:
int a;
virtual void p() {}
};
class B :virtual public A // 8 + 4 + 4 = 16
{
public:
int b;
virtual void p() { cout << "B"; }
};
class C :virtual public A // 8 + 4 + 4 + 4 = 20
{
public:
int c;
virtual void p2() {}
};
class D :public B, public C // (C)12 + (B) (8) + A(8) + D(4)
{
public:
int d;
virtual void p3() {}
};
int main()
{
A a;
B b;
C c;
D d;
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
cout << sizeof(D) << endl;
return 0;
}
可以在visual studio下直接查看对象的内存分布
https://blog.csdn.net/longlovefilm/article/details/80558879
先看A的
再看B
可以看到,B与A共享虚函数表指针
再看C
由于有新的函数,所以不能共享虚函数表指针
最后看D
于是有以下总结:
1.对于B来说,由于p是对A里面p的重写,所以放在虚基类的虚函数表中
2.对于C来说,由于有新的虚函数,所以需要有自己的虚函数表指针
3.对于D来说,不必有自己的虚函数表指针,虚函数可能放在C或B或A对应的虚函数表中?(这个还需要进一步研究)
4.子类的对象,里面的虚函数表指针和虚基类指针存放的地址一样,如下:
B * b = new B;
B * b1 = new B;
这两个对象的内存中,虚函数表指针和虚基类表指针存放的地址是一样的。