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

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

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

举例说明:

(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. TFS应用经验-大型项目数据仓库抽取导致的TFS应用无法访问

    在超过千人使用的TFS生产环境中,每天周期性出现无法正常查看工作项白板.无法签入代码.无法进行自动化构建.无法进行报表数据的查看等情况,真是一个让人焦灼的问题.作为TFS平台支持和运维的团队,也想进了 ...

  2. 关于hibernate注解的简单应用

    @Override 用途:重写父类的同名方法 单元测试注解 @Test 用途:用于测试 @Before 用途:单测方法走之前执行 @After 用途:单测方法走之后执行 注解的目标:替换小配置.替换h ...

  3. 关于rem的使用和less编译工具考拉

    前提: 1.使用rem的前提是首先要设置好页面的根节点的大小: <script> (function(){ var html = document.documentElement; var ...

  4. OpenCv 2.4.9 (一) Mat基础结构&如何遍历图片

    前言 因为对图像方面感兴趣,所以有空学学OpenCV的使用,并且希望以此为引子,带领自己入门图像领域. 先post上几个参考网站,上面有完整源码: http://docs.opencv.org/2.4 ...

  5. c#基础语句——分支语句

    一.if...else... if是如果的意思,else是另外的意思,if后面跟(),括号内为判断条件,如果符合条件则进入if语句执行命令.如果不符合则不进入if语句.else后不用加条件,但是必须与 ...

  6. SQLDataSet中执行DDL语句

    在SQLDataSet中执行我们输入的DDL语句,并观察执行结果. 这里为了省输入的时间,从先输好的记事本中复制的SQL语句.效果图: ******************************** ...

  7. 腾讯云分布式高可靠消息队列服务CMQ架构

    在分布式大行其道的今天,我们在系统内部.平台之间广泛运用消息中间件进行数据交换及解耦.CMQ是腾讯云内部自研基于的高可靠.强一致.可扩展分布式消息队列,在腾讯内部包括微信手机QQ业务红包.腾讯话费充值 ...

  8. oracle数据库命令-持续更新

    一.系统命令 登录 dba用户命令 sqlplus / as sysdba 2. 用户命令 删除用户 DROP USER **** CASCADE; DROP SCHEMA **** CASCADE; ...

  9. Bzoj超级经验大放送题集(好评如潮哦~~~)

    其实这些是因为没有数据才形成的...唯一可惜的是这些都是需要300软妹币才能打开的萌萌哒权限题*^_^* 好啦,吾来教你如何快速AC么么哒 pascal: 1 begin end. //Pascal ...

  10. Visual Studio 2015创建ASP.NET5项目“DNX SDK version 'dnx-clr-win-x86.1.0.0-beta5' 无法安装的错误

    使用asp.net5建立web application时遇到DNX SDK版本 “dnx-clr-win-x86.1.0.0-beta5”无法安装的错误 解决办法: 运行cmd: 1.输入: @pow ...