C++中封装和继承的访问权限
众所周知,C++面向对象的三大特性为:封装,继承和多态。下面我们就先对封装做一些简单的了解。封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具。类的定义如下:
class circle
{
public: //成员变量
int m_L;
int m_H;
public: //成员函数(方法)
double get_Square()
{
return m_L*m_H;
}
}
在上面的代码中,我们定义了一个 "circle" 类,主要包含三个部分:成员变量,成员方法和访问控制(public, protect, private)。
- public:公共权限,类内可以访问,类外可以访问
- protected:保护权限,类内可以访问,类外不可以访问,继承的子类可以访问
- private:私有权限,类内可以访问, 类外不可以访问,继承的子类不可以访问
下面我们的对这三点进行测试,以加深印象:
class circle
{
public:
int public_L;
int public_H;
private:
int private_L;
int private_H;
protected:
int protect_L;
int protect_H;
public: //成员函数(方法)
circle() //通过构造函数对成员变量进行赋值
{
public_L = 20, public_H = 30;
private_L = 40, private_H = 50;
protect_L = 60, protect_L = 70;
}
double get_Square()
{
return private_L*private_H;
}
};
在定义的 "circle" 类中,由于变量 public_L,public_H 和 get_Square 都是公有权限,因此在类内类外均可访问,下面这两种写法均正确:
circle C1; //实例化类对象
double S_1 = C1.get_Square();
double S_2 = C1.public_H * C1.public_L;
但是,由于变量 private_L,private_H 均为私有权限, 因此在类内可以访问,即 get_Square() 能够访问,在类外下面的写法是错误的:
int S_3 = C1.private_H * C1.private_L; //Error:成员变量不可访问
同理,对于保护权限的变量,类内可以访问,类外不可访问:
int S_3 = C1.private_H * C1.private_L; //Error:成员变量不可访问
同样,继承的方式也有 public, protect, private 三种:
- public:公共继承,保持父类中成员的访问权限,继承到子类
- protected:保护继承,除私有权限外,父类中所有的成员都以保护权限的方式继承到子类
- private:私有继承,父类中所有的成员都以私有权限的方式继承到子类。
下面看一个例子:
class son1:public circle{
}; // 公有继承,保持 circle 父类中的访问权限不变
class son2:protected circle{
}; // 保护继承,除去 circle 父类中私有权限,其余成员你的的访问权限全部为保护权限
class son3:private circle{
}; // 私有继承,父类中所有成员的访问权限全部为私有权限
那么通过上述分析,
son1的访问权限与父类一致;son2只能在类内访问父类中的成员,但是他的子类中也可以通过public或者protected继承的方式访问到父类 "circle" 中的成员son3只能以私有的方式来继承父类中的成员
所以:
son1 s1;
s1.get_Square(); //访问public权限,正确
son2 s2;
s2.get_Square(); //Error:成员变量不可访问,protected权限
son3 s3;
s3.get_Square(); //Error:成员变量不可访问,private权限
C++中,类既可以用class 定义,也可以用struct定义。struct与class唯一的区别就在于默认访问权限不同struct默认为公共访问权限,Class默认为私有访问权限。举个例子:
class a
{
int m_a; //class 定义,未声明访问权限默认为private
};
struct b
{
int m_b; //struct 定义,未声明访问权限默认为public
};
于是:
a c_a;
c_a.m_a = 20; // Error: 成员变量不可访问
b s_b;
s_b.m_b = 20; // 正确,访问public类型变量
C++中封装和继承的访问权限的更多相关文章
- java中4种修饰符访问权限的区别及详解全过程
java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...
- C++ 继承的访问权限
1.它解决什么问题?为什么设计出继承的各种访问权限? 可以这样认为,C++继承会把父类的东西拉到自己这里,这些东西都是自己的,父类中的字段和方法都有访问权限,如果我想改变这些东西的访问权限,该怎么办? ...
- this/super/static/final/匿名对象/继承/抽象类/访问权限修饰符
1.this关键字的作用 1)调用本类中的属性; 2)调用本类中的构造方法;且只能放首行,且必须留一个构造方法作为出口,即不能递归调用 3)表示当前对象; 2.匿名对象 ...
- java中封装,继承,多态,接口学习总结
### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通 ...
- 怎样提高Windows Azure Cloud Service中的WebRole的文件访问权限
关键字:WebRole 1. 背景 Web应用程序需要读取和写入该项目下的文件的权限. 在默认情况下,W3wp.exe 和WaIISHost.exe的运行账号是Network Service,而Net ...
- ethereum(以太坊)(二)--合约中属性和行为的访问权限
pragma solidity ^0.4.0; contract Test{ /* 属性的访问权限 priveta public internal defualt internal interlnal ...
- java中4种修饰符访问权限的区别
访问权限 类 本包 子类 其他包 public √ √ √ √ protected √ √ √ x default(缺省) √ √ x x private √ x x x
- Java中封装、继承和多态
封装: 封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度. 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性. 访问修饰符有public,private,prot ...
- MVC 5 中Filter控制 action的访问权限
1,创建一个继承自 FilterAttribute, IActionFilter的类 namespace HeatMetering2.Filters { public class HMV2Authen ...
随机推荐
- C++ primer plus读书笔记——第1章 预备知识
第1章 预备知识 1. Ritchie希望有一种语言能将低级语言的效率.硬件访问能力和高级语言的通用性.可移植性融合在一起,于是他在旧语言的基础上开发了C语言. 2. 在C++获得一定程度的成功后,S ...
- opencv实战——图像矫正算法深入探讨
摘要 在机器视觉中,对于图像的处理有时候因为放置的原因导致ROI区域倾斜,这个时候我们会想办法把它纠正为正确的角度视角来,方便下一步的布局分析与文字识别,这个时候通过透视变换就可以取得比较好的裁剪效果 ...
- margin (子元素远离父元素边框)
如果父盒子没有设置border框着,那么他的子元素无法利用margin-top 来远离父元素的上边框 如果使用了margin-top会使子元素和父元素一起往下移 (子想离,父不设置border边框 则 ...
- CSS层叠性
比较id,类,标签的数量 谁多就谁在上面 255个类的权重等于一个id 当权重一样时,以后设置的为准 通过继承而来的,权重为0 !important (设置权重无限大)可以影响权重,但只能影响选中的, ...
- Nacos服务发现
基础配置初始化 NacosDiscoveryClientConfiguration NacosDiscoveryProperties 初始化Nacos基础配置信息的bean,主要指yaml中配置Nac ...
- [bug] Flask:jinja2.exceptions.UndefinedError: 'None' has no attribute 'id'
问题 Python Flask做的购物网站,添加购物车时,提示错误 解决 检查发现是MySQL中不正常的空数据导致,删除此条记录即可 参考 https://www.jb51.cc/python/186 ...
- 保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case)
保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java.Golang两种客户端教学Case) 目录 什么是AMQP 和 JMS? 常见的MQ产品 安装RabbitM ...
- at在指定的时间执行命令+atq列出用户待处理作业(jobs)
按下crtl+d取消定时任务 # at now+1hourat> echo"a">aat> <EOF>at> <EOT>job 4 ...
- Vim删除空行
Vim删除空行 1 Vim删除空行 打开vim输入:g/^$/d :g将在与正则表达式匹配的行上执行命令. 正则表达式是'空行',命令是:d (删除)
- 编译安装rsyslog
安装gcc-c++ 615 yum -y install gcc c++ 616 yum -y install gcc-c++ 安装libestr.libee wget http://libestr. ...