本文目的
最近看了《深入探索c++对象模型》,被其中关于虚函数的各种继承的内存结构,绕来绕去,十分纠结。并且在《深入探索c++对象模型》这本书中的的各种结构是大体的策略,可以用来理解,但是gcc编译器中的具体实现比较详细。而网上gcc下各种继承的存储结构都不是特别地详细。
本文以gcc下单继承,多重继承,虚拟继承的具体存储模型详细展开。
gcc下不同继承方式的存储模型
以下是gcc下单继承,多重继承和虚拟继承的存储细节。
- 测试环境为:Linux 4.15.0 ,gcc 5.4.0,ubuntu16.04。
- 测试方式通过 g++ -fdump-class-hierarchy xx.cpp 命令生成分析文件并cat
- 以上命令能够生成cpp文件中类的内存结构,有兴趣的读者可以自己尝试一下
单继承
我们之前的例子都是单继承,即每一个派生类只继承于一个父类。狗继承动物,猎狗继承狗。
单继承无重写:
如果子类没有重写父类的虚函数
class Animal{
public:
virtual void eat(){
}
virtual void run(){
}
private:
int name;
int age;
};
class Dog : public Animal{
public:
virtual void shout(){
}
virtual void stand(){
}
};
这里贴一个生成分析文件的内容作为演示,之后各种继承方式,由于过长不再贴出。
存储模型:
单继承重写
如果子类重写了父类的eat方法
class Animal{
public:
virtual void eat(){
}
virtual void run(){
}
private:
int name;
int age;
};
class Dog : public Animal{
public