您的位置:首页 > 编程语言 > C语言/C++

C++ 类的继承四(类继承中的重名成员)

2016-06-30 10:17 405 查看
//类继承中的重名成员
#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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: