• C++类继承内存布局(三)


    参考:http://blog.csdn.net/jiangyi711/article/details/4890889#

    (三)成员函数

    类X中每一个非静态成员函数都会接受一个特殊的隐藏参数——this指针,类型为X* const

    该指针在后台初始化为指向成员函数工作于其上的对象

    在成员函数内,成员变量的访问是通过在后台计算与this指针的偏移来进行

    struct P {
       int p1;
       void pf(); // new
       virtual void pvf(); // new
    };

    声明虚成员函数会造成对象实例占用更多的内存空间,因为虚成员函数需要虚函数表指针

    声明非虚成员函数不会造成对象实例的任何内存开销

    P:pf()的点定义:

    void P::pf() { // void P::pf([P *const this])
       ++p1;   // ++(this->p1);
    }

    P:pf()接收了一个隐藏的this指针参数,对每个成员函数的调用,编译器都会自动加上这个参数

    在pf()函数内,对于成员变量的访问全部通过this指针进行,有的继承层次下this指针需要调整,访问成员的开销会增大

    1)覆盖成员函数

    和成员变量一样,成员函数也会被继承。通过在派生类中重新定义基类函数,一个派生类可以覆盖基类函数定义

    覆盖是静态的还是动态的依赖于成员函数是否被声明为虚函数

    class A
    {
    public:
            int a;
            virtual void func(){cout << "a ";cout << a << endl;}
    };
    
    class B : public A
    {
    public:
            int a;
            void func()
            {
                    cout << a << endl;
                    A::func();
            }
    };
    
    int main()
    {
            B b;
            b.a = 2;
            b.A::a = 3;
            b.func();
            b.A::func();
    }

    执行结果:

    2

    a 3

    a 3

    子类中的数据成员无论是否与父类中的数据成员同名,父类的数据都会被正常继承

    如果子类重载了父类的成员函数,则会发生覆盖,但是仍然可以通过 父类名::成员函数名 的方式在子类中调用父类成员函数,同时由于数据成员会正常继承下来,所以用子类对象调用父类成员函数时,子类对象中的数据包含了父类的数据成员,成员函数中访问的变量会使用子类中继承下来的变量,无论变量名是否与子类中的相同 

    除了虚函数,其他函数和数据都是静态绑定!!

    b.A::func()中的func函数含有一个隐含的this指针 A *const,所以this->a将发生静态绑定,将调用实例b中的基类部分的数据a

    基于const的重载:可以理解为const成员函数的隐藏this指针类型为 const A *const,非const成员函数的隐藏this指针类型为A *const,形参不同,实现函数重载

  • 相关阅读:
    合并vector里的内容,输出一个string
    免费矢量图标下载【转载】
    NX二次开发-UFUN打开选择文件夹对话框UF_UI_create_filebox
    Windows路径操作API函数学习【转载】
    NX二次开发-UFUN设置对象线型UF_OBJ_set_font
    NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突【转载】
    NX二次开发-UFUN将工程图中的点坐标映射到建模绝对坐标UF_VIEW_map_drawing_to_model
    NX二次开发-UFUN将建模绝对空间中的点映射到工程图坐标UF_VIEW_map_model_to_drawing
    NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point
    VC操作Excel之基本操作(颜色等)【转载】
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4358627.html
Copyright © 2020-2023  润新知