zoukankan      html  css  js  c++  java
  • 关于c++对象模型

      在学习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   

       

  • 相关阅读:
    单例
    Label自适应高度
    通知中心(以夜间模式为例)
    ios VFL屏幕自适应
    网络请求数据(同步POST,异步POST)
    linux 设备文件
    linux 文件存取 软硬联接的区别
    linux 磁盘管理与文件系统
    linux开机过程
    Build Antlr4 projects with eclipse java project template.
  • 原文地址:https://www.cnblogs.com/zhuxingtian/p/9863853.html
Copyright © 2011-2022 走看看