我有以下C ++代码。
#include<iostream>
using namespace std;
class A
{
int aa;
public:
virtual void sound()
{
cout << "I am A" << endl;
}
};
class B:public A
{
int bb;
public:
void sound()
{
cout << "I am B" <<endl;
}
};
class C:public B
{
int cc;
public:
void sound()
{
cout << "I am C"<<endl;
}
};
int main()
{
A* a = new A();
B* b = new B();
C* c = new C();
cout << "size of A :" << sizeof(A) << endl;
cout << "size of B :" << sizeof(B) << endl;
cout << "size of C :" << sizeof(C) << endl;
}
此代码生成以下输出。
A的大小:16 B的大小:16 大小C:24
如果没有在A类声音方法中的虚拟关键字,它就会产生。
A的大小:4 B的大小:8 大小C:12
所以,这意味着对于v-table,已经分配了一些内存,并且它们在3个类中不相等。当有虚函数和没有虚函数时,我无法弄清楚每个类分配了多少内存。有人可以在2个场景中解释我。
更新1: 编译器版本:gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1) 操作系统:ubuntu 14.04
更新2: 给出可能的重复说明结构中的填充。当在这里应用相同的概念时,解决了关于虚函数的问题。但是当我们删除虚拟关键字时,似乎父类的私有变量已进入子类。有人可以解释一下吗?