IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++】访问的控制与继承 -> 正文阅读

[C++知识库]【C++】访问的控制与继承

访问说明符

访问说明符本类内友元子类内类外
private××
protected×
public

(默认成员的访问权限是private的)
样例:

class A {
	int a;		//默认为private
public:
	int b;
protected:
	int c;
private:
	int d;

public:
	void func() {
		//类内都可访问
		a = 0;
		b = 0;
		c = 0;
		d = 0;
	}
	friend void AFriend(A &a);
};

class B : public A {
public:
	void func() {
		//子类只有父类部分的public和protected可以访问
		//a = 0;
		b = 0;
		c = 0;
		//d = 0;
	}

	void testA(A& a) {
		this->c;	//可以访问
		//不可访问:派生类只能访问自身基类部分的protcted成员,
		//对于其它的基类对象的protected成员不可访问
		//cout << a.c;	
	}

void AFriend(A& a) {
	cout << a.a << endl;
}
int main() {
	A a;
	//a.a = 0;			//私有的,不可访问
	a.b = 0;
	//a.c = 0;				//受保护的,不可访问
	//a.d = 0;				//私有的,不可访问

	AFriend(a);

	return 0;
}

注意:派生类只能访问自身基类部分的protcted成员,对于其它的基类对象的protected成员是不可访问的。就好像父亲愿意给你的物品你可以拿,但是别人的父亲给自己儿子的物品你不能拿。

公有、私有和保护继承

某个类对其继承而来的成员的访问权限受到两个因素影响:一个是在在基类中该成员的访问说明符,另一个是继承时在派生列表中的访问说明符。

class AA : public A{}
class BA : public A{}
class CA : public A{}

需要注意的是,派生访问说明符对于派生类的成员(及友元)对基类成员的访问并不会有影响, 派生类能否访问基类成员只与基类成员的访问说明符有关。
派生访问说明符的目的是控制派生类的使用者(包括派生类的派生类)能否访问派生类的基类部分成员:
派生访问说明符对派生类内对基类成员访问不影响:

class A {
public:
	void pub_func(){}
protected:
	void pro_func(){}
private:
	void pri_func(){}
};

class PubA : public A {};
class ProA : protected A {};
class PriA : private A {
	void test() {
		//派生类内能否访问只与基类成员访问说明符有关
		pub_func();
		pro_func();
		//pri_func();			//私有的不可访问
	}
};


对派生类用户有影响:

int main() {
	PubA pubA;
	ProA proA;
	PriA priA;

	pubA.pub_func();
	//proA.pub_func();			//不可访问
	//priA.pub_func();				//不可访问

	return 0;
}

包括派生类的派生类:

class APubA : public PubA {
	void test() {
		//PubA公有继承自A,其子孙类对A的访问权限不变
		pub_func();
		pro_func();
		//pri_func();
	}
};

class BPubA : public ProA {
	void test() {
		//PubA保护继承自A,A的公开成员对BPubA为保护的
		pub_func();		//protected的
		pro_func();
		//pri_func();
	}
};

class CPubA : public PriA {
	void test() {
		//PubA私有继承自A,A的所有成员对CPubA为私有的
		//pub_func();
		//pro_func();
		//pri_func();
	}
};

改变个别成员的可访问性

如果需要修改派生类继承的基类的个别成员的访问级别,可以通过using声明来实现:

class A{
public:
	int pub_v;
protected:
	int pro_v;
}

class B : private A{			//私有继承
public:
	using A::pub_v;		//修改该成员访问级别
protected:
	using A::pro_v;
}

默认的继承保护级别

struct的默认继承级别是public的,而class的默认继承级别是private的。

struct B : A{}		//相当于struct B : public A{}
class B : A{}		//相当于class B : private A{}

补充:在C++中,其实struct和class唯一的差别就是默认成员访问说明符和默认派生访问说明符不同,除此之外使用上没有其他差别。

相关资料:
《C++Primer》第五版 7.2、15.5节

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-15 11:29:21  更:2022-05-15 11:30:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 16:59:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码