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 ...
随机推荐
- 如何将PDF文件中的部分信息隐藏或遮盖呢?
由于工作需要,总是需要对PDF文件中的内容进行部分隐藏.之前,作为VIP,可以使用某软件对PDF中的信息进行部分遮盖,现在,VIP到期了,我也不想继续花钱了(哭穷,嘻嘻) 在信息时代,只要会百 ...
- vim下的查找命令
linux下vim 查找命令: /text --查找text, 按n查找下一个, N查找上一个 ?text --查找text(反向查找), 按n查找下一个, N查找上一个 */# --查找光标当前的单 ...
- 【Python】【算法】【排序】用Python实现排序的三种算法
class SortTest: def __init__(self): pass # 冒泡排序 def BubbleSort(self, value): if isinstance(value, li ...
- 实验四 Web服务器2
任务详情 基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用Linux Socket实现: Web服务器的客户端服务器,提交程序运行截图 实现GET即可,请求,响应要符合HTTP协议规范 服务 ...
- redisTemplate实现分布式锁(释放锁用lua脚本)
package com.xxx.platform.util; import org.springframework.beans.factory.annotation.Autowired; import ...
- WampServer3.0服务器端开启ssl认证后重启Apache失败,解决办法
最近项目中需要访问网站的 https 地址,于是进行部署,什么事情都是想起来简单,做起来难,想着一天就能搞定的事儿,结果前后折腾了三天. 现在把部署的经历记录下来,希望对朋友们有所帮助. 1.在西部数 ...
- U盘插上电脑上后自动备份文件
缘由 一直有个不好的习惯,将所有文件都存在个人U盘,下班直接拔了就回家. 前久把U盘插入MacBook后,U盘就无法读数据了,搞了很久也没搞定. 当然了,里面的数据也无法使用了. 所以,现在的想法: ...
- openGL 学习笔记 (一) 了解 OpenGL,创建第一个OpenGL窗口
// 序章最开始我以为OpenGL是一系列的API,他给出了一系列对计算机图像的操作接口.但其实OpenGL其实并不是一个API,他是由khronos组织制定并维护的规范. 早期的OpenGL使用立即 ...
- Gitbook部署
title: Gitbook部署 # 标题 date: 2020-06-14 08:00:00 借助Gitbook,写自己的第一本电子书 Gitbook部署 一.电脑环境 Git 环境,我的电脑上已经 ...
- 虚拟机搭建linux环境&&使用winscp连接搭建好的linux环境步骤
一.需要的工具 虚拟机应用程序.一个镜像(ubuntu等).winscp可执行程序 二.安装虚拟机以及插入镜像 1)选择虚拟机 我安装的是VMware 就是这个,因为之前用的都是vitualbox现在 ...