C++ 对象内存布局 (1)

转载来自 http://blog.csdn.net/pathuang68/article/details/4101970

1

内容概要:

满足下面2个条件时,

1. 父类有虚函数,子类无虚函数(即无虚函数重写或无虚函数覆盖)

2. 非虚继承

类对象之内存布局

Base类中有两个虚函数vfBase_1()、vfBase_2()和一个整形成员变量m_base, Derived类中有一个整形成员变量m_derived,二者的关系如下:

 

 1 #include <iostream>
 2 using namespace std;
 3 class Base
 4 {
 5 public:
 6          int m_base;
 7          inline virtual void vfBase_1()
 8          {
 9                    cout << "This is in Base::vfBase_1()" << endl;
10          }
11 
12          inline virtual void vfBase_2()
13          {
14                    cout << "This is in Base::vfBase_2()" << endl;
15          }
16 };
17 
18 class Derived : public Base
19 {
20 public:
21          int m_derived;
22 };

Derived对象的memory layout图解如下:

 

 

 

2

内容概要:

满足下面2个条件时,

1. 父类有虚函数,子类也有虚函数,但子类并没有重写或覆盖父类的虚函数

2. 非虚继承

类对象之内存布局

 

如果在Derived类中增加一个下面的虚函数,会怎么样呢?Base类和Derived类之间的关系如下:

  

新加入的虚函数定义如下:

1 inline virtual void vfDerived()
2 
3 {
4 
5       cout << "This is in Derived::vfDerived()" << endl;
6 
7 }

Derived对象的memory layout图解如下:

 

 

我们发现,Derived类本身并没有因为增加了一个虚函数,而增加一个vptr,这是因为编译器将Derived类中定义的虚函数加入到了其基类的虚函数表中,Derived因此共用了基类Basevptr,就象是它自己的一样(其实当然也是Derived类自己的,因此Base subobject都被Derived包含了)。为什么说这个vptrBase的呢?因为基类在派生类中必须保证其所谓的“原始的完整性”。

 

3

内容概要:

满足下面2个条件时,

1. 父类无虚函数,子类有虚函数

2. 非虚继承

类对象之内存布局

如果将Base中的两个虚函数删除,情况有会怎么样呢?

将Base中的两个虚函数删除,其他保持不变。Base类和Derived类两者之间的关系如下:

  

Derived对象的memory layout图解如下:

 

 

这次由于Base类中不存在虚函数,所以在Derived类对象中的Base subobject就不会有vptr了,但Derived类中有虚函数,所以它的对象中就有vptr了。

 

 

 

posted @ 2013-10-27 21:56  0弓虽  阅读(185)  评论(0编辑  收藏  举报