zoukankan      html  css  js  c++  java
  • 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,形参不同,实现函数重载

  • 相关阅读:
    LA 2038 Strategic game(最小点覆盖,树形dp,二分匹配)
    UVA 10564 Paths through the Hourglass(背包)
    Codeforces Round #323 (Div. 2) D 582B Once Again...(快速幂)
    UVALive 3530 Martian Mining(贪心,dp)
    UVALive 4727 Jump(约瑟夫环,递推)
    UVALive 4731 Cellular Network(贪心,dp)
    UVA Mega Man's Mission(状压dp)
    Aizu 2456 Usoperanto (贪心)
    UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
    Aizu 2304 Reverse Roads(无向流)
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4358627.html
Copyright © 2011-2022 走看看