c++ 继承访问控制初步
访问控制方式这里有篇很好的文章,其实内容也是总结c++primer上的内容
现在就按照这篇的文章举例进行学习.
思路
不同继承方式的影响主要体现在:
1、派生类成员对基类成员的访问控制。
2、派生类对象对基类成员的访问控制
三种继承方式
公有继承(public)
所有public和protected成员在派生类中的访问方式不变,但是私有成员(private)不能访问
通过派生类的成员函数能够访问基类的public和protected成员,但是不能访问基类的成员.
通过派生类的对象能够只能访问基类中的public成员.
举例说明
class A {
public :
int a = 0;
protected:
int b = 0;
private:
int c = 0;
}
class B:public A{
public:
void test1(){
cout
}
}class A {
public :
int a = 0;
protected:
int b = 0;
private:
int c = 0;
};
class B:public A{
public:
void test1(){
cout<<"visit public a "<< a<<endl;
}
void test2(){
cout << "visit protected "<< b <<endl;
}
void test3(){
// cout << "visit private "<< c <<endl; 违反第1)条 报错
}
};
int main()
{
B b;
b.test1();
b.test2();
//b.test3();
cout << b.a<<endl;
// cout << b.b<<endl; 违反第2)条 报错
// cout << b.c<<endl; 违反第3)条 报错
return 0;
}
私有继承(private)
基类中的成员都以private的身份出现在派生类当中,派生类中的成员不能访问父类的private成员
1)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员
2)通过派生类的对象不能访问基类中的任何成员。
如果将上边的代码改成B私有继承A.新增一条报错语句 cout << b.a <<endl;违反2)
保护继承(protected)
基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问。
1)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。
2)通过派生类的对象不能访问基类中的任何成员。
它的报错情况同private.其实在垂直访问上procted与public相同,对类对象的用户来说,它又和private相同.即实现了代码重用的同时还限定了用户的访问权限.为了说明问题我们再加一个类:
class C: protected B{
public:
void test2(){
cout << "visited b in C"<< b<<endl;
}
};
如果有:
C c;
c.b肯定报错,但是C中test2()函数不会报错,可以访问b,因为b的protect属性被传递过来了.但是如果B私有继承A的话,b就不会传递过来.代码重用性就不好了.
当然还有一些其他有待研究的遗留问题,比如友元在访问控制中有什么作用呢,会不会被继承.六大函数在继承中又扮演着什么角色.留待以后继续研究.如要深究,请仔细阅读c++ primer P549的内容继续学习.
c++ 继承访问控制初步的更多相关文章
- C++ 类继承 笔记(初步)
本节内容源于对C++ primer第13章的学习,这本书把C++的原理将得明明白白.网上的博客往往讲得一头雾水.到头来还不如看原书本. 问题 首先给出一题: #include<stdio.h&g ...
- C#---------------继承和多态初步
继承:在程序中,如果一个类A:类B,这种机制就是继承. 子类可以继承父类的所有内容(成员)吗? 解析: 1.私有成员(属性和方法) 2.构造函数 3.final修饰过的方法,子类不能进行重写 3.访问 ...
- C++继承和多态
继承 访问控制 基类的成员函数可以有public.protected.private三种访问属性. 类的继承方式有public.protected.private三种. 公有继承 当类的继承方式为pu ...
- 快速理解类的访问控制(public,protected,private)
接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...
- C++学习笔记-继承
类之间可以建立联系,这就使得类可以有某种关系 类之间的关系 has-A:包含关系,一个类使用另一个已经定义好的类的数据 uses-A:使用关系,友元或者对象参数传递 is-A:是的关系,这就是继承,具 ...
- Maven之继承
这里我还是将通过一个例子来了解一下Maven继承的初步使用配置.还是使用三个工程项目Project-Parent.Project-C和Project-D来进行说明,三个项目关系如下: <?xml ...
- 【windows 访问控制】四、访问控制项ACE
访问控制项 具体内容 : https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ifs/access-control-entry 访问 ...
- Java基础 —— 面向对象
面向对象的程序设计: 1. 基本特征:抽象性,封装性,继承性,多态性. 2. 类及成员的访问控制:private:同一类中: default:同一包中: protected:子类中: public:全 ...
- C++ one more time
写在前面:我们学习程序设计的方法先是模仿,然后举一反三.在自己的知识面还没有铺开到足够解决本领域的问题时,不要将精力过分集中于对全局无足轻重的地方!!! 以下参考钱能老师的<C++程序设计教程 ...
- mfc 友元类
知识点 继承类成员的访问级别 友元类 继承访问控制: 基类 派生类(能否访问) public private protected 派生类类 派生类对象 派生类 派生类对象 派生类类 派生类对象 pri ...
随机推荐
- 2022-05-06内部群每日三题-清辉PMP
1.一个项目正处于执行阶段,一些可交付成果已经准备好交给客户.团队成员希望快速交付这些可交付成果,以节省时间并获得资金.若要实现这个目标,就必须消除质量控制相关的任务. 项目经理应该怎么做? A.让团 ...
- Angular单页应用程式 (SPA)+Azure AD重新导向登入
一.app.module.ts中设定应用程式 1.将MSAL Angular相关设置封装为auth.module.ts import { NgModule } from '@angular/core' ...
- Docker Mysql修改时区
背景 时区是使用了世界标准时间(UTC).因为在中国使用,所以需要把时区改成东八区的 或者启动容器时设置 -e TZ=Asia/Shanghai 永久修改 进入容器 docker exec -it m ...
- 微服务笔记之Eureka03(服务注册分析)
服务注册接口源码分析: com.netflix.eureka.resources.ApplicationResource#addInstance public Response addInstance ...
- 【DM论文阅读杂记】推荐系统 注意力机制
Paper Title Real-time Attention Based Look-alike Model for Recommender System Basic algorithm and ma ...
- python 爬虫 selenium 与 chromedriver
selenium 安装 pip install selenium chromedriver 下载 https://npm.taobao.org/mirrors/chromedriver?spm ...
- Jquery 简单实现demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ctfshow web入门 命令执行 web29-36
29-36 全是基于get传参执行 eval() 函数,均采用黑名单匹配,不同点在于黑名单的变化 web29 1 error_reporting(0); 2 if(isset($_GET['c'])) ...
- python 操作 ES 二、mappings
环境 python:3.8 es:7.8.0 环境安装 pip install elasticsearch==7.8.0 from elasticsearch import Elasticsearch ...
- dbeaver把表数据导出csv时字符串自动加双引号问题解决
背景: mysql 5.7 dbeaver 21.1.4 解决:如下图,括起字符这里设置一个 空格(space)即可: 参考1