C++中public、protect、private的访问权限控制

访问权限

一个类的public成员变量、成员函数,可以通过类的成员函数、类的实例变量进行访问

一个类的protected成员变量、成员函数,无法通过类的实例变量进行访问。但是可以通过类的友元函数、友元类进行访问。

一个类的private成员变量、成员函数,无法通过类的实例变量进行访问。但是可以通过类的友元函数、友元类进行访问。

访问权限demo

#include <iostream>

class ReferencePerission
{
friend class FriendClass;
friend void FriendFunc();
public:
int public_num;
void public_func(){std::cout <<"public_func "<<public_num<<std::endl;}
protected:
int protected_num;
void protected_func(){std::cout <<"protected_func "<<protected_num<<std::endl;}
private:
int private_num;
void private_func(){std::cout <<"private_func "<<private_num<<std::endl;}
}; class FriendClass
{
public:
FriendClass() {
std::cout<<"FriendClass"<<std::endl;
ReferencePerission ref;
ref.public_num = 1;
ref.protected_num = 2;
ref.private_num = 3;
ref.public_func();
ref.protected_func();
ref.private_func();
} ~FriendClass()
{ }
}; void FriendFunc()
{
std::cout<<"FriendFunc"<<std::endl;
ReferencePerission ref;
ref.public_num = 1;
ref.protected_num = 2;
ref.private_num = 3;
ref.public_func();
ref.protected_func();
ref.private_func();
} int main()
{
ReferencePerission ref; ref.public_num = 1;
//ref.protected_num = 2; /* 编译出错 declared protected here */
//ref.private_num = 3; /* 编译出错 declared private here */
ref.public_func();
//ref.protected_func(); /* 编译出错 declared protected here */
//ref.private_func(); /* 编译出错 declared private here */ FriendFunc(); /* 友元函数可以访问public,protected,private成员变量和函数 */ FriendClass friendObj; /* 友元类可以访问public,protected,private成员变量和函数 */ return 0;
}

继承权限

public继承

派生类通过public继承,基类的各种权限不变 。

派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。

派生类的实例变量,可以访问基类的public成员,但是无法访问protected、private成员,仿佛基类的成员之间加到了派生类一般。

可以将public继承看成派生类将基类的public,protected成员囊括到派生类,但是不包括private成员。

protected继承

 派生类通过protected继承,基类的public成员在派生类中的权限变成了protected 。protected和private不变。

派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。

派生类的实例变量,无法访问基类的任何成员,因为基类的public成员在派生类中变成了protected。

可以将protected继承看成派生类将基类的public,protected成员囊括到派生类,全部作为派生类的protected成员,但是不包括private成员。

private成员是基类内部的隐私,除了友元,所有人员都不得窥探。派生类的友元,都不能访问

private继承

派生类通过private继承,基类的所有成员在派生类中的权限变成了private。

派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。

派生类的实例变量,无法访问基类的任何成员,因为基类的所有成员在派生类中变成了private。

可以将private继承看成派生类将基类的public,protected成员囊括到派生类,全部作为派生类的private成员,但是不包括private成员。

private成员是基类内部的隐私,除了友元,所有人员都不得窥探。派生类的友元,都不能访问

总结:继承修饰符,就像是一种筛子,将基类的成员筛到派生类。public、protected、private,就是筛子的眼。

通过public继承,所有基类成员(除了private),public、protected都到了派生类里面,public筛眼比较大,不会改变访问权限。

通过protected继承,所有基类成员(除了private),public、protected都到了派生类里面,protected筛眼大小适中,所有过来的成员都变成了protected。

通过private继承,所有基类成员(除了private),public、protected都到了派生类里面,private筛眼最小,所有过来的成员都变成了private。

#include <iostream>

using namespace std;

class InheritPerission
{
public:
string public_str;
void public_func(){std::cout <<"public_func "<<public_str<<std::endl;}
protected:
string protected_str;
void protected_func(){std::cout <<"protected_func "<<protected_str<<std::endl;}
private:
string private_str;
void private_func(){std::cout <<"private_func "<<private_str<<std::endl;}
}; /*派生类通过public继承,基类的各种权限不变*/
class InheritPublic : public InheritPerission
{
public:
InheritPublic(){
/*派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员*/
public_str = "public_str";
protected_str = "protected_str";
//private_str = "private_str";
public_func();
protected_func();
//private_func();
}
~InheritPublic(){};
}; /*派生类通过protected继承,基类的public成员在派生类中的权限变成了protected 。protected和private不变*/
class InheritProtected : protected InheritPerission
{
public:
InheritProtected(){
/*派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员*/
public_str = "public_str";
protected_str = "protected_str";
//private_str = "private_str";
public_func();
protected_func();
//private_func();
}
~InheritProtected(){}
}; /*派生类通过private继承,基类的所有成员在派生类中的权限变成了private*/
class InheritPrivate : private InheritPerission
{
public:
InheritPrivate(){
/*派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员*/
public_str = "public_str";
protected_str = "protected_str";
//private_str = "private_str";
public_func();
protected_func();
//private_func();
}
~InheritPrivate(){}
}; int main()
{
InheritPublic inheritPublic;
InheritProtected inheritProtected;
InheritPrivate inheritPrivate; /*派生类的实例变量,可以访问基类的public成员,但是无法访问protected、private成员*/
inheritPublic.public_func();
//inheritPublic.protected_func();
//inheritPublic.private_func(); /*派生类的实例变量,无法访问基类的任何成员,因为基类的public成员在派生类中变成了protected*/
//inheritProtected.public_func();
//inheritProtected.protected_func();
//inheritProtected.private_func(); /*派生类的实例变量,无法访问基类的任何成员,因为基类的所有成员在派生类中变成了private*/
//inheritPrivate.public_func();
//inheritPrivate.protected_func();
//inheritPrivate.private_func(); return 0;
}

c/c++再学习:C++中public、protect、private的访问权限控制的更多相关文章

  1. C++中public/protect/private三种访问权限控制

    一.成员访问权限控制 1.public (1)public成员变量可以被成员函数访问  [访问性] (2)public成员可以被实体对象访问  [访问性] (3)public成员可以成为子类成员  [ ...

  2. Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

  3. [转] Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

  4. java中public与private还有protect的区别

    java中public与private还有protect的区别 总是忘记.

  5. public protect private. 草稿。

    public protect private. 草稿. #include <iostream> #include <thread> #include <memory> ...

  6. C++中public,protected,private派生类继承问题和访问权限问题

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

  7. java中4种修饰符访问权限的区别及详解全过程

    java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...

  8. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  9. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

随机推荐

  1. 3-ftp搭建成功,服务器能访问,外网无法连接和访问

    登录 ECS 管理控制台,找到相应的实例. 在实例的右侧单击管理,进入实例详情页面.选择本实例安全组. 在安全组列表页面,找到相应的安全组,单击配置规则. 在安全组规则页面,单击添加安全组规则. 在添 ...

  2. MySQL8.0.19主从环境搭建(CentOS7)

    默认情况下,复制是异步的,从站不需要永久连接以接收来自主站的更新.根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表. MySQL中复制的优点包括: 横向扩展解决方案 - 在多个从站之间 ...

  3. vs2005设置打开文件和保存文件编码

    一般vs2005打开文件时会自动侦测文件编码,自动以相应的编码格式打开.但是如果不认识的编码,就会出现乱码. Set VS2005 to use without BOM UTF-8 encoding ...

  4. vscode中文配置说明

    1.官网下载vscode安装完毕后, 2.在扩展中搜索chinese,选择:“Chinese (Simplified) Language Pack for Visual Studio Code” 3. ...

  5. python 生产者 --- 消费者

    值得拿出来 看看的 多进程 爬取 (生产) , 解析 (消费) 网页 同时进行,可以作为以后项目扩展使用 from bs4 import BeautifulSoup import requests i ...

  6. 只有try和finally,没有catch

    因为没有catch捕获异常,所以异常发生时,会将异常抛出,导致程序中止:在抛出之前会执行finally中的代码. 用于无法捕获处理异常,需要在程序结束之前进行善后处理的场景

  7. hibernate原生sql获取list<T>异常解决

    /** * <p>Title: getbigestMinIntegral</p> * <p>Description: 获取最大的MinIntegral(原则上即最高 ...

  8. L2-005 集合相似度 (25 分) (STL——set)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608 题目: 给定两个整数集合,它们的相似度 ...

  9. A Discriminative Feature Learning Approach for Deep Face Recognition

    url: https://kpzhang93.github.io/papers/eccv2016.pdf year: ECCV2016 abstract 对于人脸识别任务来说, 网络学习到的特征具有判 ...

  10. 11:57:24 [org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1] WARN o.apache.kafka.clients.NetworkClient - [Consumer clientId=consumer-2, groupId=jiatian_api] 3 partitions have leader……

    错误如下: 11:57:24 [org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1] WARN  o.apache.kaf ...