在学习c++的时候,大部分教材与书籍都是在讲述c++的语法,或者说是在描述语言的一些特性。比如我们熟悉的抽象,封装,继承,多态。当然,这其中也包含了类与对象,多继承,虚继承,虚函数,纯虚函数等等一些具有语言特性的内容。大部分书籍在这方面的内容是比较全面的(大部分语言特性)。但是,对于类这种抽象数据类型在底层如何实现,大部分书籍只是科普性的介绍了一下。。。。。这样对于我们这些初学者来说,是很难受的一件事情。
我们知道,c++是一门比较接近底层的高级语言。所以,它包含了一些比较复杂的东西(指针,应该是很复杂才对)。我们在使用指针的时候,还是需要了解,我们的指针都干了些什么,一提到指针,这就需要我们去了解底层(对象模型),否则代码就会出现我们始料未及的bug。了解了对象模型,也可以帮助我们理解一些令人费解的语法内容,比如静态绑定,动态绑定,多继承,虚继承,虚函数列表等等。据我了解到的内容来看,这些是比较费解的。
在描述c++对象模型之前,先介绍一下,笔者是因为什么,才迫切的想去了解c++的对象模型。
#include <iostream> #include <cstdlib> using namespace std; class Base { public: void fm() { cout << "Base " << endl; } }; class Derive:public Base { public: void fm() { cout << "Derive " << endl; } }; int main() { Base base; Base *pBase; Derive derive; pBase = (Derive *)&derive; derive.fm(); pBase->fm(); system("pause"); return 0; }
这段代码会运行出什么结果呢?结果应该是Derive和Derive呢?比如这样
还是一个令我们费解的内容呢?
运行结果如图所示 相信这对于初学者来说应该是一个比较费解的内容。
我们的pBase指向了一个Derive对象,却调用了自己的成员函数。实在是令人费解。
还有关于虚函数列表的问题,以及静态数据成员,非静态数据成员,静态成员函数,虚成员函数,非虚非静态函数,这些最底层的东西在c++中如何实现。这都是一些教材一笔带过的内容。这些在李普曼大师的《深度探索C++对象模型》一书中都有所涉猎,笔者希望每一位学习C++的人都可以读一读这本书,相信你会有所收获。
当然,我们也可以不了解关于对象指针的内容,但这样的话,我们在写代码时,就无法充分的发挥c++语言的威力。比如我们要使用多态的时候,必须使用指针或引用。这个时候,如果不了解一些底层的知识。往往会出现我们难以理解的bug