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

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

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

举例说明:

(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. select中的文字垂直居中的问题

    select文字在默认和边框高度增加时 是默认居中的.你要是不想居中的话可以用padding值调整.但是右侧的三角不会改变. select在高度减小时.字体是不会垂直居中的.无论你用什么他都不会垂直居 ...

  2. Codeforce 水题报告(2)

    又水了一发Codeforce ,这次继续发发题解顺便给自己PKUSC攒攒人品吧 CodeForces 438C:The Child and Polygon: 描述:给出一个多边形,求三角剖分的方案数( ...

  3. unity脚本的运行顺序以及单例的实现

    unity引擎把所有脚本先行编译后,在运行的时候一批,一批的函数进行执行. unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> St ...

  4. 随手小记(es6)

    在学习前辈阮一峰大神写的<ECMAScript入门>一书的过程中,第九章中讲到对象扩展时,第一条我就有点看不懂 ES6允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. v ...

  5. java常见文件操作

    收集整理的java常见文件操作,方便平时使用: //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if ( ...

  6. kafka c++客户端编译

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据通常是 ...

  7. sicily 1063. Who's the Boss 排序+递推

    #include <cstdio> #include <algorithm> using namespace std; struct Emp{ int id, salary, ...

  8. DP 动态规划

    p1269 马棚 题目: 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他 ...

  9. 最新虚拟机SAP ECC6.0 EHP7带示例数据IDES版+BW740

    学习SAP,需要虚拟机,请联系QQ:858-048-581 版本:ECC6.0 EHP7.虚拟机操作系统:windows server 2008 64bit..数据库:SQL2008 R2.系统已经做 ...

  10. 配置apache

    1. 修改httpd.conf文件 # vi  /usr/local/apache/conf/httpd.conf 1) 设置根目录的路径 根目录是指Apache存放配置文件和日志文件的目录,配置参数 ...