zoukankan      html  css  js  c++  java
  • C++ 类的继承四(类继承中的重名成员)

    //类继承中的重名成员
    #include<iostream>
    using namespace std;
    
    /*
    自己猜想:
    
    对于子类中的与父类重名的成员,c++编译器会单独为子类的这个成员变量再开辟一块内存空间,
    把这个重名的成员变量当成子类的独有属性
    在子类对象中如果访问重名成员,会默认访问子类独有那个成员变量,而不是访问父类的成员变量
    
    对于从父类继承的所有成员,c++编译器会在子类对象的内存空间前部分放置父类的所有成员
    父类的成员函数访问的都是  子类对象中  父类内存空间那部分的成员变量,
    --如果不是这样,那么父类中能访问子类成员变量?
    又因为子类对象的重名成员  是独立于父类    属于子类对象的一个成员变量
    
    对于被子类继承的父类的成员函数 访问的是父类中的那个重名成员的解释
    根据类的对象管理模型,类的非静态成员函数就是一个全局函数,只是函数中默认有一个对象指针参数
    对于父类成员函数而言,父类成员函数有一个参数就是父类对象指针,
    此时子类对象调用父类成员函数,不就是类的赋值兼容性原则吗--父类指针调用子类对象,
    父类对象指针不强转成子类对象指针,那么这个父类指针不是只能访问父类对象的成员吗?
    因此得出结论,子类对象调用继承于父类的成员函数 访问的是父类中的那个重名成员
    */
    
    /*
    总结:
    派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽了基类的同名成员
    在派生类中使用基类的同名成员,显式的使用类名限定符 -----    类名::成员
    */
    
    class PointA{
    public:
        int x;
        int y;
        void PrintA(){
            cout << "x=" << x << ";y=" << y << endl;
        }
        void PrintB(){
            cout << "x=" << x << ";y=" << y << endl;
        }
    };
    
    class PointB :public PointA{
    public:
        PointB(){
            x = 3;
            y = 8;
            z = 7;
            //在子类内部中给可访问父类成员属性赋值
            PointA::y = 11;
        }
        int y;
        int z;
        void Test1(){
            cout << "z=" << z << ";y=" << y << endl;
        }
        void PrintB(){
            cout << "z=" << z << ";y=" << y << endl;
        }
    };
    
    void ProtectA(){
        PointB pb1;
        pb1.PrintA();
        cout << "----------------" << endl;
        pb1.Test1();
        cout << "----------------" << endl;
        pb1.y = 33;
        //在子类外部中给可访问父类成员属性赋值
        pb1.PointA::y = 44;
        pb1.PrintA();
        cout << "----------------" << endl;
        pb1.Test1();
    }
    
    void ProtectB(){
        PointB pb1;
        //对于重名函数调用规则和重名变量规则类似
        pb1.PrintB();
        cout << "--------------------" << endl;
        pb1.PointA::PrintB();
    }
    
    void main(){
        //ProtectA();
        ProtectB();
        system("pause");
    }
  • 相关阅读:
    2C Numerical Sequence (hard version)
    2A Subset——折半枚举+二分
    假设检验、Z检验与T检验
    使用PyCaret构建机器学习模型
    Python图像处理
    NumPy教程
    NLP中的标识化
    概率论的数学基础
    用直方图和箱线图理解数据
    神经网络简易教程
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5629100.html
Copyright © 2011-2022 走看看