C++派生类对基类成员的访问

派生类继承了基类的全部数据成员和除了构造、析构函数之外的全部成员函数,但是这些成员在派生类中的访问属性在派生类的过程中是可以调整的,继承方式控制了基类中具有的不同访问属性。

基类的成员有公有(public)、保护(protected)和私有(private)三种访问属性,类的继承方式也有公有继承(public)、保护继承(protected)和私有继承(private)三种。不同的继承方式导致具有不同访问属性的基类成员在派生类中具有新的访问属性。

注:(1)基类中的私有成员在派生类中是隐藏的,只能在基类内部访问。

(2)派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。此时派生类对基类中各成员的访问能力与继承方式无关,但继承方式将影响基类成员在派生类中的访问控制属性,基类中公有成员和保护成员在派生类中的访问控制属性将随着继承方式而改变:①派生类从基类私有继承时,基类的公有成员保护成员在派生类中仍是公有成员;②派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都改变为私有成员;③派生类从基类保护继承时,基类的公有成员在派生类中改变为保护成员,基类的保护成员在派生类中仍为保护成员。

例1 分析下列程序是否正确

cpp 复制代码
#include<iostream>
using namespace std;
class Point
{
private:
	int x, y;
public:
	void InPoint(int x, int y) { this->x = x; this->y = y; }
	void Move(int x, int y) { this->x += x; this->y += y; }
	int  Getx() { return x; }
	int Gety() { return y; }
};
class Rectangle :public Point
{
private:
	int w, h;
public:
	void InRectangle(int x, int y, int w, int h) { InPoint(x, y); this->w = w; this->h = h; }
	int Getw() { return w; }
	int Geth() { return h; }
};
int main()
{
	Rectangle r;
	r.InRectangle(2, 3, 10, 20);
	r.Move(3, 2);
	cout << r.Getx() << "." << r.Gety() << "." << r.Getw() << "." << r.Geth() << endl;
	return 0;
}

程序运行正确。

派生类虽然无法直接调用基类的私有成员但可以间接调用。

例2 分析下列程序是否正确

cpp 复制代码
#include<iostream>
using namespace std;
class Base
{
protected:
	int data;
};
class Dervied :public Base
{
public:
	void fun() { data = 1; }
};
int main()
{
	Base objb;
	Dervied objd;
	objb.data = 2;
	objd.fun();
	return 0;
}

在这里会报错。因为data是保护成员无法直接访问。但在派生类中可以访问公有成员和私有成员。

参考《全国计算机等级考试二级教程------C++语言程序设计》

相关推荐
tankeven10 分钟前
HJ178 【模板】双指针
c++·算法
charlie11451419140 分钟前
嵌入式C++工程实践——第13篇:第一次重构 —— enum class取代宏,类型安全的开始
开发语言·c++·vscode·stm32·安全·重构·现代c++
CHANG_THE_WORLD1 小时前
C++ 文件读取函数完全指南
开发语言·c++
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 300. 最长递增子序列 | C++ 动态规划 & 贪心二分
c++·leetcode·动态规划
阿正的梦工坊1 小时前
JavaScript 闭包 × C++ 类比:彻底搞懂闭包
开发语言·javascript·c++
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 72. 编辑距离 | C++ 经典 DP 增删改状态转移
c++·算法·leetcode
无限进步_1 小时前
【C++】寻找字符串中第一个只出现一次的字符
开发语言·c++·ide·windows·git·github·visual studio
楼田莉子2 小时前
Linux网络:IP协议
linux·服务器·网络·c++·学习·tcp/ip
wuminyu2 小时前
专家视角看JVM_StartThread
java·linux·c语言·jvm·c++
敲上瘾2 小时前
高并发内存池(三):PageCache(页缓存)的实现
linux·c++·缓存·高并发内存池·池化技术