“C++是C的超集”,这句话里包含了两个问题:
1. C++兼容C;
2. C++在C之上进行了扩展;
那C++在C之上进行了哪些扩展呢?众所周知,C++内置了众多编程机制、支持众多编程风格:面向过程、基于对象、面向对象、面向、基于模板、泛型、元编程等等。其中,以面向过程、基于对象、面向对象的编程机制最为流行。
大家都知道,面向对象有三个基本特征:数据封装与抽象、继承、多态。下面通过分析C++对象内存模型,来剖析C++面向对象的这三个基本特征。
讲到C++的数据封装和抽象,就不得不提类的成员函数和成员数据:
成员数据 非静态对象、静态对象 成员函数 非静态函数、静态函数、虚函数 下面,直接上测试代码,直观的看看C++的基本对象内存模型。
class A{}; //size: 1 class B{ //size: 1 static int mem; static void print(); }; class C{ //size: 4 int mem; void print(); };
class D{ //size: 8 char mem; static int s_mem; virtual void print1(){};
virtual void print2(){}; };
class E{ //size: 4 virtual void print1() = 0; virtual void print2() = 0; };
从测试结果来看,
1. 空类的Size为1,应为编译器自动添加了一个标记字节。(Size为0就太诡异了!)
2. 静态数据和静态函数,配置到对象之外。
3. 非静态函数,配置到对象之外。
4. 含有虚函数的对象,配置有一个指向类虚拟表(vtbl)的指针。
5. 纯虚对象(接口对象),配置有一个指向类虚拟表的指针。
来源:oschina
链接:https://my.oschina.net/u/1045176/blog/127738