情况1:
class A {
public:
int A_1;
int A_2;
// virtual void aa() {};
};
class B :public virtual A{
public:
int B_1;
int B_2;
int B_3;
//virtual void aa() {};
//virtual void bb() {};
};
class C :public virtual B {
char i[3];
public:
virtual void cc() {};
};
结果:(32位)8、24、36
情况二:
#include "stdafx.h"
#include<vector>
#include<iostream>
using namespace std;
class A {
public:
int A_1;
int A_2;
virtual void aa() {};
};
class B :public A{
public:
int B_1;
int B_2;
// virtual void aa() {};
virtual void bb() {};
};
class C :public virtual B {
char i[3];
public:
virtual void cc() {};
};
int main(int argc,char *argv[])
{
B b;
cout << "sizeof(A)=" << sizeof(A) << endl;
cout << "sizeof(b)=" << sizeof(B) << endl;
cout << "sizeof(C)=" << sizeof(C) << endl;
return 0;
}
结果: (32位)12、20、32
情况三:
class A {
public:
int A_1;
int A_2;
virtual void aa() {};
};
class B :public A{
public:
int B_1;
int B_2;
int B_3;
// virtual void aa() {};
virtual void bb() {};
};
class C :public virtual B {
char i[3];
public:
virtual void cc() {};
};
int main(int argc,char *argv[])
{
B b;
cout << "sizeof(A)=" << sizeof(A) << endl;
cout << "sizeof(b)=" << sizeof(B) << endl;
cout << "sizeof(C)=" << sizeof(C) << endl;
return 0;
}
结果:(32位)12、24、36
情况四:存在多态的情况下
class A {
public:
int A_1;
int A_2;
virtual void aa() {};
};
class B :public A{
public:
int B_1;
int B_2;
int B_3;
virtual void aa() {};
virtual void bb() {};
};
class C :public virtual B {
char i[3];
public:
virtual void cc() {};
};
结果:(64位编译器)16、32、56 (32位编译器)12、24、36
情况五:虚继承:
虚继承的时候子类会有一个指向自己虚函数表的指针,同时也会加入一个指向父类的虚类指针,然后还要包含父类的所有内容。
虚继承时如果子类父类都有虚函数,那么它会重新建立一张虚表,不包含父类虚表的内容;而在普通的继承中却是在父类虚表的基础上建立一张虚表。这就意味着如果虚继承中子类父类都有各自的虚函数,在子类里面就会有两个虚函数表指针,一个指向父类的虚表,一个指向子类的虚表,而普通的继承只有一个指向子类虚表的指针
class A {
public:
int A_1;
int A_2;
virtual void aa() {};
};
class B :public virtual A{
public:
int B_1;
int B_2;
int B_3;
//virtual void aa() {};
virtual void bb() {};
};
class C :public virtual B {
char i[3];
public:
virtual void cc() {};
};
int main(int argc,char *argv[])
{
A a;
B b;
C c;
cout << "sizeof(A)=" << sizeof(A) << endl;
cout << "sizeof(b)=" << sizeof(b) << endl;
cout << "sizeof(C)=" << sizeof(C) << endl;
return 0;
}
结果:(64位编译器)16、48、72,(32编译器)12、32、44
此时内存分布如下