c++派生类的访问控制权限
派生类必须通过使用类派生列表, 明确指出它是从哪个(哪些)基类继承而来的。类派生列表的形式是:首先是一个冒号,后面紧跟以逗号分隔的基类列表(可以多继承,但一般不使用多继承),其中每个基类前面可以有以下三种访问说明符中的一个:public,private,protectedd。
c++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望其派生类进行覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义为虚函数(virtual)。当我们使用指针或者引用调用虚函数时,该调用将被动态绑定。根据引用或者指针所绑定的对象类型不同,该调用可能执行基类的版本也可能执行某个派生类的版本。在某些时候基类希望它的派生类有权访问该成员,同时禁止其他用户访问。我们用受保护的(protected)访问运算符来说明这样的成员。
基类通过在其成员函数声明语句之前加上关键字virtual使得改函数执行动态绑定。任何构造函数之外的非静态函数都可以是虚函数。关键字virtual只能出现在类内部声明语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。
之后会详细介绍虚析构造函数,现在只用记住作为继承关系中根节点的类(基类)通常都会定义一个虚析构造函数。即本例中的 virtual ~Parent()=default。基类通常应该定义一个虚析构造函数,即使该函数不执行任何实际操作也是如此(原因等后面随笔的解释——不这样可能会导致内存泄漏,释放子类的资源同时也要释放父类的资源才行)。
代码操练:
#include<iostream>
using namespace std;
class Parent {
public:
Parent():a(),b(),c(){}
virtual ~Parent() = default;
int a;
protected:
int b;
private:
int c;
};
//public继承
class Child1 :public Parent{
public:
void test()
{
a = ;//√基类共有的属性派生类可以随意访问
b = ;//√基类受保护的属性可以在基类类内和子类类内中访问
// c = 0;//× 基类私有属性可以继承但不能访问
}
protected: private:
};
//private继承
class Child2 :private Parent {
public:
void test()
{
a = ;//√基类共有的属性派生类类内可以随意访问,就算是private继承也可以,但是派生类外不能访问
b = ;//√基类受保护的属性可以在基类类内和子类类内中访问,就算是private继承也可以,但是派生类外不能访问
//c = 0;//× 基类私有属性可以继承但不能访问
}
protected: private:
};
//protected继承
class Child3 :protected Parent {
public:
void test()
{
a = ;//√基类共有的属性派生类类内可以随意访问,派生类外不能访问
b = ;//√基类受保护的属性可以在基类类内和子类类内中访问,派生类外不能访问
//c = 0;//× 基类私有属性可以继承但不能访问
}
protected: private:
};
int main()
{
Child1 c1;
c1.a = ;//√
//c1.b = 20;//× 受保护的属性不能在类外访问
//c1.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类 Child2 c2;
//c2.a = 10;//× private继承基类的共有属性也不可以在类外访问
//c2.b = 20;//× 受保护的属性不能在类外访问
//c2.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类 Child3 c3;
//c3.a = 10;//× protected继承基类的共有属性也不可以在类外访问
//c3.b = 20;//× 受保护的属性不能在类外访问
//c3.c = 30;//× 基类私有属性不可在类外访问,哪怕你是我的子类
cout << "hello world!\n";
return ;
}
summary:
一个类的pubulic属性在类内、类外都可以访问,
private属性只能在这个类内访问,
protected属性可以在这个类内访问也可以在这个类的派生类类内中访问,不能在基类和派生类外部访问。
总结表如下:
基类权限: public private protected
继承权限:public 继承 public private protected
private继承 private private private
protected继承 protected private protected
继承访问权限三看原则:
①:看使用的方法在类的内部还是外部
②:看子类的继承权限(public private protected)
③:看基类的权限(public private protected)
c++派生类的访问控制权限的更多相关文章
- Java类成员访问控制权限
类成员访问控制权限 在JAVA中有四种访问控制权限,分别为:private, default, protected, public 1.Private 如果一个成员方法或变量名前使用了private, ...
- C++中类继承public,protected和private关键字作用详解及派生类的访问权限
注意:本文有时候会用Visual Studio Code里插件的自动补全功能来展示访问权限的范围(当且仅当自动补全范围等价于对象访问权限范围的时候),但是不代表只要是出现在自动补全范围内的可调用对象/ ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...
- this、static、main方法、静态代码块、final关键字、Runtime类、Cloneable类、类成员的访问控制权限、异常体系
this表示当前对象,用在方法内部,当某对象调用该方法时,该方法中的this就代表调用该方法的对象: static关键字: 修饰类属性后,该属性就成为该类所有实例的公共属性,修改该属性值,所有的实例的 ...
- 013_linuxC++之_派生类中权限的调整
(一)在上一篇012_LINUXC++之_类的继承定义中我们知道在派生类中可以访问public和protectd中的数据 (二)那么我们就可以在派生类中将上面两个中的数据进行权限的修改 (三)程序 # ...
- Chapter15:派生类
在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区别对待,对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明为虚函数. 派生类必须将其继承而来的成员函数 ...
- 快速理解类的访问控制(public,protected,private)
接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private. 理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外) ...
- Java中的访问控制权限
简介 Java中为什么要设计访问权限控制机制呢?主要作用有两点: (1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. (2) ...
随机推荐
- 〖Linux〗zigbee实验之cc2430的cc debugger固件升级实录
开发环境:Windows XP 1. (Trouble)一开始,使用IAR提示此设备不可使用(意味着无法下载程序): 2. (Search)通过一番的仔细查找,发现是cc debugger的Evalu ...
- 【Docker】拉取Oracle 11g镜像配置
以下是基于阿里云服务器Centos 7操作 1.拉取Oracle11g镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_1 ...
- Oracle常用标准表
一.INV(库存) 子库存:mtl_secondary_inventories 事物处理:mtl_material_transactions mmt 事务处理来源类型:mtl_txn_source_t ...
- chardet 模块
#coding:utf-8 #指定本文件编码为utf-8 #python 27 #xiaodeng #chardet模块 #chardet模块下载地址: #1)http://pan.baidu.com ...
- 关于vsftpd的refusing to run with writable root inside chroot()问题
今天在上班帮测试的同事搭建ftp服务器时出现的一个问题 服务搭建完成后连接时报这个错误: refusing to run with writable root inside chroot() 查了资料 ...
- 微信小程序裁剪图片成圆形
代码地址如下:http://www.demodashi.com/demo/14453.html 前言 最近在开发小程序,产品经理提了一个需求,要求微信小程序换头像,用户剪裁图片必须是圆形,也在gith ...
- iOS开发之复制字符串到剪贴板
概述 一般有邀请复制链接需求功能,把字符串复制到系统剪贴板,供用户粘贴使用链接. 详细 代码下载:http://www.demodashi.com/demo/10714.html 一.主要思路 1.在 ...
- XMLHttpRequest cannot load ...谷歌浏览器跨域问题
HTML页面通过Ajax调用公网web服务时,浏览器请求发送成功,但是响应的 xhr.status==0,控制台报错如下 XMLHttpRequest cannot load http://ws.we ...
- [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...
- Oracle 11g的Deferred Segment Creation
本篇主要介绍Oracle 11g中推出的“延迟段创建”(Deferred Segment Creation)特性,以及当我们使用这种特性时,需要注意的问题. 1)Deferred Segment Cr ...