class A { };
class B {public:
int bi;
virtual void func0() { }
};
class C{public:
char c;
int ci;
virtual void func() { }
virtual void func1() { }
};
class D : public C{public:
int di;
virtual void func() { }
virtual void func1() { }
virtual void func3() { }
};
class E : public B, public C {public:
int ei;
virtual void func0() { }
virtual void func1() { }
virtual void func2() { }
};
B b;C c;D d;E e;
void main(){
std::cout << "B : " << sizeof(B) << " b: " << &b << " b.bi " << &b.bi << std::endl;
std::cout << "C : " << sizeof(C) << " c: " << &c << " c.c " << (void*)&c.c << " c.ci " << &c.ci << std::endl;
std::cout << "D : " << sizeof(D) << " d: " << &d << " d.c " << (void*)&d.c << " d.ci " << &d.ci << " d.di " << &d.di << std::endl;
std::cout << "E : " << sizeof(E) << " e: " << &e << " e.bi " << &e.bi << " e.c " << (void*)&e.c << " e.ci " << &e.ci << " e.ei " << &e.ei << std::endl;
输出结果
//根据输出的地址以及对象的声明顺序,可知全局数据块的内存增长顺序,向上增长
B : 8 b: 001C236C b.bi 001C2370 //b只含有一个bi ,而bi不是b的首地址,首地址存的vptr,4个字节大小
C : 12 c: 001C2374 c.c 001C2378 c.ci 001C237C //c同上
D : 16 d: 001C2380 d.c 001C2384 d.ci 001C2388 d.di 001C238C //d的首地址存的虚表指针(继承的和自己的都一张表中),然后C的成员
E : 24 e: 001C2390 e.bi 001C2394 e.c 001C239C e.ci 001C23A0 e.ei 001C23A4
//E的 首先继承b的虚函数的虚表指针,b的成员,继承自C的虚函数的虚表指针,C的成员,E的成员 ,自己的虚函数丢哪张表呢?
由地址各个类和其成员的地址可知
a.单继承的类的对象(含虚函数的)的内存分布是
(1).第一个地址存的是 **继承自基类的虚函数的表指针**
(2).后面跟的是 **基类的成员变量**
(3).然后是**派生类的成员变量**
b.多重继承的类的内存分布是
(1).第一个地址是 **继承自基类的虚函数的表指针**
(2).后面是**基类的成员变量**
(3).然后**第二个继承自基类的虚函数的表指针**
(4).然后**第二个基类的成员变量**
(5).最后是**派生类的成员变量**
对于空class A,大小为空,但是sizeof(A) = 1,因为其有一个占位符