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");
}

 

posted on 2016-06-30 10:17  寒魔影  阅读(3078)  评论(0编辑  收藏  举报

导航