C++学习15 继承权限和继承方式
C++继承的一般语法为:
class 派生类名:[继承方式] 基类名{
派生类新增加的成员
};
继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选的,如果不写,默认为 private 或 protected。
1) public继承方式
- 基类中所有public成员在派生类中为public属性;
- 基类中所有protected成员在派生类中为protected属性;
- 基类中所有private成员在派生类中不可访问。
2) protected继承方式
- 基类中的所有public成员在派生类中为protected属性;
- 基类中的所有protected成员在派生类中为protected属性;
- 基类中的所有private成员在派生类中仍然不可访问。
3) private继承方式
- 基类中的所有public成员在派生类中均为private属性;
- 基类中的所有protected成员在派生类中均为private属性;
- 基类中的所有private成员在派生类中均不可访问。
由此可见:
- 基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。
- 基类中的 private 成员在派生类中始终是不可访问的。
private 继承限制太多,实际开发中很少使用,一般使用 public。
一个完整的例子:
#include<iostream>
using namespace std;
//基类--Pelple
class People{
private:
char *name;
int age;
public:
void setName(char*);
void setAge(int);
void display();
};
void People::setName(char *name){ this->name = name; }
void People::setAge(int age){ this->age = age; }
void People::display(){ cout<<name<<"的年龄是 "<<age; }
//派生类--Student
class Student: public People{
private:
float score;
public:
Student(char*, int, float);
void display1();
};
Student::Student(char *name, int age, float score){
this->setName(name);
this->setAge(age);
this->score = score;
}
void Student::display1(){
this->display();
cout<<",成绩是 "<<score<<endl;
}
int main(){
Student stu("小明", , 90.5);
stu.display1();
return ;
}
读者要注意 Student 类的构造函数和 display1() 函数。在构造函数中,我们要设置 name、age、score 变量的值,但 name、age 在基类中被声明为 private,所以在 Student 中不可直接访问,只能借助基类中的成员函数 setName()、setAge() 来间接访问。
在 display1() 函数中,同样不能访问 People 类中 private 属性的成员变量,只能借助 People 类的成员函数来间接访问。
改变访问属性
使用 using 关键字可以改变基类成员在派生类中的访问属性,例如将 public 改为 private,或将 private 改为 public。
using 关键字使用示例:
#include<iostream>
using namespace std;
class People{
protected:
char *name;
int age;
public:
void say();
};
void People::say(){
cout<<"你好,欢迎来到C语言中文网!"<<endl;
}
class Student: public People{
private:
using People::say; //改变访问属性
public:
using People::name; //改变访问属性
using People::age;
float score;
void learning();
};
void Student::learning(){
cout<<"我是"<<name<<",今年"<<age<<"岁,我学习非常努力,这次考了"<<score<<"分!"<<endl;
}
int main(){
Student stu;
stu.name = "小明";
stu.age = ;
stu.score = 99.5f;
stu.say(); //compile error
stu.learning();
return ;
}
代码中首先定义了基类 People,它包含两个 protected 属性的成员变量和一个 public 属性的成员函数。定义 Student 类时采用 public 继承方式,People 类中的成员在 Student 类中的访问权限默认是不变的。
不过,我们使用 using 改变了它们的默认访问权限,如代码第16~20行所示,将 say() 函数修改为 private 属性的,是降低访问权限,将 name、age 变量修改为 public 属性的,是提高访问权限。
多级继承
实际开发中,经常会有多级继承的情况。例如,类A为基类,类B继承自类A,类C又继承自类B,那么类C也是类A的派生类,它们构成了多级继承的关系。如下图所示:
多级继承的规则与上面相同,这里仅举例说明。
class A{ //基类
public:
int i;
protected:
void f2( );
int j;
private:
int k;
};
class B: public A{ //public继承
public:
void f3( );
protected:
void f4( );
private:
int m;
};
class C: protected B{ //protected方式
public:
void f5( );
private:
int n;
};
各成员在不同类中的访问属性如下:
| i | f2 | j | k | f3 | f4 | m | f5 | n | |
| 基类A | 共有 | 保护 | 保护 | 私有 | |||||
| 共有派生类B | 共有 | 保护 | 保护 | 不可访问 | 共有 | 保护 | 私有 | ||
| 保护派生类C | 保护 | 保护 | 保护 | 不可访问 | 保护 | 保护 | 不可访问 | 共有 | 私有 |
C++学习15 继承权限和继承方式的更多相关文章
- C++ 类中的3种访问权限和继承方式
访问权限:public 可以被任意实体访问,protected 只允许子类(无论什么继承方式)及本类的成员函数访问,private 只允许本类的成员函数访问.三种继承方式分别是 public 继承,p ...
- 大数据学习--day10(继承-权限-super-final-多态-组合)
继承-权限-super-final-多态-组合 权限修饰符 内容 public protected default(不写就是它) ...
- Java(15)面向对象之继承
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201615.html 博客主页:https://www.cnblogs.com/testero ...
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
- JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...
- javascript实现继承的几种方式
原型链方式实现继承 function SuperType(){ this.property = true; this.colors = ['red','blue','green']; } SuperT ...
- 转】Maven学习总结(五)——聚合与继承
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4058008.html 感谢! 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1. ...
- JavaScript高级特性-实现继承的七种方式
声明和约定: 在C++和Java中,我们可以通过关键字class来声明一个类,在JavaScript中没有这个关键字,但我们知道可以通过new一个function创建对象,这个function类似C+ ...
- (转)Maven学习总结(五)——聚合与继承
孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(五)——聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <mod ...
随机推荐
- python tornado框架使用
处理方法 t_handler.py from tornado.web import RequestHandler class IndexHandler(RequestHandler): def get ...
- C++静态存储,动态存储
什么是静态存储,动态存储静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束. 动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放.典型的例子是函数的 ...
- 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符
正常URL: http://localhost:16990/GoodsOrder/OrderRevoke.aspx??6G5lFi6xuoiLDhfOOOIkBYwy8RGpkfuza2gLlJrlT ...
- Python命令行中输入pip提示不是内部或外部命令
WIN764位,Python34 输入命令python -m pip
- eclipse开发Android程序sdk和avd的图标不见了
在eclipse中开发我们的Android程序时,安装sdk是必不可少的,有时候会出现sdk和avd的图标都不见了的情况,一般出现这种情况的原因是你从别处copy了一个sdk的包然后直接在引用造成的, ...
- Spring和SpringMVC的区别
spring 是是一个开源框架,是为了解决企业应用程序开发,功能如下◆目的:解决企业应用开发的复杂性◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能◆范围:任何Java应用简单 ...
- Spring 注解总结
声明:这是转载的.内容根据网上资料整理.相关链接:http://www.360doc.com/content/10/1118/16/2371584_70449913.shtmlhttp://www.i ...
- HBase(一): c#访问hbase组件开发
HDP2.4安装系列介绍了通过ambari创建hbase集群的过程,但工作中一直采用.net的技术路线,如何去访问基于Java搞的Hbase呢? Hbase提供基于Java的本地API访问,同时扩展了 ...
- UI-程序的运行顺序
在AppDelegate.m里面的每个方法里都输入(包括main文件里也输入) NSLog(@"%s %d”,__func__,__LINE__); __func__ :代表使用的方法 __ ...
- 05文件与IO
这节主要学习了read.write.lseek.目录访问(opendir.readdir.closedir)这几个系统调用及其简单的应用. 一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O ...