C++对象模型——内存布局

  1. 无多态的对象内存布局
  2. 多态下的对象内存布局

无多态的对象内存布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
public:
A(int _a1,int _a2) : a1(_a1),a2(_a2);
void foo1();
private:
int a1;
int a2;
};


class B : public A {
public:
B(int _b1,int _b2) : b1(_b1),b2(_b2){}
void foo2();
private:
int b1;
int b2;
}

如果一个类没有虚函数,那么它的对象的布局跟C语言的struct一样,对象内存布局中只有成员变量.如果类B继承A,因为B的构造函数是先构造父类再构造子类,所以内存模型中是在A的成员变量后加上B的成员变量.

示意图:

多态下的对象内存布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A {
public:
A(int _a1,int _a2) : a1(_a1),a2(_a2);
virtual void foo1();
virtual void foo2();
virtual void foo3();
private:
int a1;
int a2;
}

class B : public A {
public:
B(int _b1,int _b2) : b1(_b1),b2(_b2){}
virtual void foo4();
virtual void foo2();
virtual void foo5();
private:
int b1;
int b2;
}

当父类存在虚函数时,子类继承父类的虚函数表,虚函数表的顺序先是父类的虚函数,再是子类的虚函数.父类的虚函数被子类重写时,虚函数表中的父类被替换为子类的虚函数指针.

示意图:


多重继承,多继承,菱形继承等待更..

script>