三,继承方式&访问限定符

派生类可以继承基类中除了构造函数和析构函数之外的所有成员,但是这些成员的访问属性是由继承方式决定的。

不同的继承方式下基类成员在派生类中的访问属性:

举例说明:

(1)public继承

eg1:

#include <iostream>
using namespace std; class Person
{
public://公有数据成员
int length;//身高
int weight;//体重
}; class Student:public Person
{
public:
void test1()
{
length = 183;//子类中可访问父类的共有成员(包括属性和方法)
weight = 70;
total = 300;
}
private:
int total;//总分
char* school;//学校
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象可访问基类的公有成员(包括属性和方法)
s1.weight = 45;
}
int main()
{
Funtest();
return 0;
}

由上述例子可得出:公有继承中,派生类中可访问基类的公有成员(包括属性和方法),类外派生类的对象可访问基类的公有成员(包括属性和方法)

eg2:

#include <iostream>
using namespace std; class Person
{
protected://保护数据成员
int length;//身高
int weight;//体重
}; class Student:public Person
{
public:
void test1()
{
length = 183;//子类中可访问父类的保护成员(包括属性和方法)
weight = 70;
total = 300;
}
private:
int total;//总分
char* school;//学校
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可访问基类的保护成员(包括属性和方法)
s1.weight = 45;
}
int main()
{
Funtest();
return 0;
}

编译结果:

由上述例子可得出:公有继承中,派生类中可访问基类的保护成员(包括属性和方法),类外派生类的对象不可以访问基类的保护成员(包括属性和方法)

eg3:

#include <iostream>
using namespace std;
class Person
{
private://私有数据成员
int length;//身高
}; class Student:public Person
{
public:
void test1()
{
length = 183;//子类中不可以访问父类的私有成员(包括属性和方法)
}
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可以访问基类的私有成员(包括属性和方法)
}
int main()
{
Funtest();
return 0;
}

编译结果:

由上述例子可得出:公有继承中,派生类中不可以访问基类的私有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

(二)保护继承

eg1:

#include <iostream>
using namespace std; class Person
{
public://公有数据成员
int length;//身高
}; class Student:protected Person
{
public:
void test1()
{
length = 183;//子类中可以访问父类的公有私有成员(包括属性和方法)
}
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可以访问基类的公有成员(包括属性和方法)
}
int main()
{
Funtest();
return 0;
}

编译结果:

结论:保护继承中,派生类中可以访问基类的公有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

eg2:

#include <iostream>
using namespace std; class Person
{
protected://保护数据成员
int length;//身高
}; class Student:protected Person
{
public:
void test1()
{
length = 183;//子类中可以访问父类的保护成员(包括属性和方法)
}
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可以访问基类的保护成员(包括属性和方法)
}
int main()
{
Funtest();
return 0;
}

编译结果:


结论:保护继承中,派生类中可以访问基类的保护成员(包括属性和方法),类外派生类的对象不可以访问基类的保护成员(包括属性和方法)

eg3:

#include <iostream>
using namespace std; class Person
{
private://私有数据成员
int length;//身高
}; class Student:protected Person
{
public:
void test1()
{
length = 183;//子类中可以访问父类的私有成员(包括属性和方法)
}
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可以访问基类的私有成员(包括属性和方法)
}
int main()
{
Funtest();
return 0;
}

编译结果:
结论:保护继承中,派生类中不可以访问基类的私有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

(三)私有继承

eg1:

#include <iostream>
using namespace std; class Person
{
public://公有数据成员
int length;//身高
}; class Student:private Person
{
public:
void test1()
{
length = 183;//子类中可以访问父类的公有成员(包括属性和方法)
}
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可以访问基类的公有成员(包括属性和方法)
}
int main()
{
Funtest();
return 0;
}

运行结果:
结论:私有继承中,派生类中可以访问基类的公有成员(包括属性和方法),类外派生类的对象不可以访问基类的公有成员(包括属性和方法)

eg2:

#include <iostream>
using namespace std; class Person
{
protected://保护数据成员
int length;//身高
}; class Student:private Person
{
public:
void test1()
{
length = 183;//子类中可以访问父类的保护成员(包括属性和方法)
}
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可以访问基类的保护成员(包括属性和方法)
}
int main()
{
Funtest();
return 0;
}

运行结果:
结论:私有继承中,派生类中可以访问基类的保护成员(包括属性和方法),类外派生类的对象不可以访问基类的保护成员(包括属性和方法)

eg3:

#include <iostream>
using namespace std; class Person
{
private://私有数据成员
int length;//身高
}; class Student:private Person
{
public:
void test1()
{
length = 183;//子类中不可以访问父类的私有成员(包括属性和方法)
}
}; void Funtest()
{
Student s1;
s1.length = 160;//类外派生类的对象不可以访问基类的私有成员(包括属性和方法)
}
int main()
{
Funtest();
return 0;
}

运行结果:
结论:私有继承中,派生类中不可以访问基类的私有成员(包括属性和方法),类外派生类的对象不可以访问基类的私有成员(包括属性和方法)

总结:

三种继承方式下,在派生类中均可访问基类的共有成员和保护成员,私有成员不能访问(因为基类和派生类不属于同一作用域).

公有继承中, 在类外通过子类的对象可访问基类的公有成员(包括成员数据和成员函数),其他情况在类外均访问不了。

保护继承中,派生类中基类的public成员降级为protected,protected降级为private。

私有继承中,派生类中基类的public成员降级为private,protected降级为private。

派生类继承了除基类的构造函数和析构函数之外的所有成员,稍后讲解。

public继承是一个接口继承,保持is-a原则。每个父类可用的成员对子类都可用,每个子类成员都可看做一个父类成员。

private和protected是实现继承,保持has-a原则。类似一组合/聚合。但它比组合更低级,当一个派生类对象需要访问基类的保护成员或需要重新定义虚函数时它就是合理的,绝大多数情况下我们都会选择public继承。

(未完待续....)

(本文来源于互联网,若有侵权,请联系博主)

【C++】浅谈三大特性之一继承(二)的更多相关文章

  1. 【C++】浅谈三大特性之一继承(一)

    一,为什么要引入继承? 继承是一个非常自然的概念,现实世界中的许多事物也都是具有继承性的. 例如,爸爸继承爷爷的特性,儿子又继承爸爸的特性等都属于继承的范畴.下面是一个简单的汽车分类图: 在这个分类图 ...

  2. 【C++】浅谈三大特性之一继承(三)

    四,派生类的六个默认成员函数 在继承关系里,如果我们没有显示的定义这六个成员函数,则编译系统会在适合场合为我们自动合成. 继承关系中构造函数和析构函数的调用顺序: class B { public: ...

  3. 浅谈python的对象的三大特性之继承

    前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...

  4. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  5. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  6. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  7. (转)java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  8. java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  9. Java学习笔记二十一:Java面向对象的三大特性之继承

    Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...

随机推荐

  1. IP数据报格式 及路由转发算法

    ip数据报分首部和数据两部分组成: 首部分为固定部分和可变部分 版本--占 4 位,指 IP 协议的版本 目前的 IP 协议版本号为 4 (即 IPv4) 首部长度--占 4 位,可表示的最大数值 是 ...

  2. node.js爬虫杭州房产销售及数据可视化

    现在年轻人到25岁+,总的要考虑买房结婚的问题,2016年的一波房价大涨,小伙伴们纷纷表示再也买不起上海的房产了,博主也得考虑考虑未来的发展了,思考了很久,决定去杭州工作.买房.定居.生活,之前去过很 ...

  3. PHPCMS 概念初学

    CMS是一个内容管理系统,主要是用来做企业站,也就是说我们在网上见到绝大部分的企业站都是用这个做的,有极少数的是用源生代码写的 如何安装? 1.从网站搜索下载安装包并解压 2.点击文件夹后显示一下两个 ...

  4. Apache Derby倒斗之路-01小道消息

    1.DERBY是什么: Apache Derby 是IBM于2004年贡献给Apache软件基金会的数据库,于2005年正式成为开源项目,Derby作为一个基于JAVA的关系型数据库框架,他拥有许多便 ...

  5. Convex Hull 实现理论+自制Python代码

    Convex Hull 概述 计算n维欧式空间散点集的凸包,有很多的方法.但是如果要实现快速运算则其难点在于:如何快速判断散点集的成员是否是在凸集的内部.如果可以简化判断的运算过程,则可以极大简化迭代 ...

  6. 怎么写jquery插件

    1. 添加js文件到html文件中,放下面的两行到html文档底部,</body>之前. <script src="js/jquery-1.9.1.min.js" ...

  7. Redis【第一篇】安装

    第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. redis 版本 redis-3.2.8 3. 修改内核参数 有三种方式: 1)编辑/etc/sys ...

  8. Ajax封装函数笔记

    Ajax封装函数: function ajax(method, url, data, success) { //打开浏览器 //1.创建一个ajax对象 var xhr = null; try { x ...

  9. Linux下自动备份MySQL

    使用expect和mysqldump备份 expect expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预. 例如,执行shell脚本的过程中,需要输入用户名.密码 ...

  10. could not resolve host: github.com 问题解决办法

    向github提交代码时出现问题,如图: 代码push失败,提示could not resolve host: github.com     解决办法:   1.打开终端,输入:ping github ...