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因此共用了基类Base的vptr,就象是它自己的一样(其实当然也是Derived类自己的,因此Base subobject都被Derived包含了)。为什么说这个vptr是Base的呢?因为基类在派生类中必须保证其所谓的“原始的完整性”。
3
内容概要:
满足下面2个条件时,
1. 父类无虚函数,子类有虚函数
2. 非虚继承
类对象之内存布局
如果将Base中的两个虚函数删除,情况有会怎么样呢?
将Base中的两个虚函数删除,其他保持不变。Base类和Derived类两者之间的关系如下:
Derived对象的memory layout图解如下:
这次由于Base类中不存在虚函数,所以在Derived类对象中的Base subobject就不会有vptr了,但Derived类中有虚函数,所以它的对象中就有vptr了。