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

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

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

举例说明:

(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. Python爬虫爬取qq视频等动态网页全代码

    环境:py3.4.4 32位 需要插件:selenium BeautifulSoup xlwt # coding = utf-8 from selenium import webdriverfrom ...

  2. XML入门知识

    什么是XML? 答:指可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据:标签没有被预定义.您需要自行定义标签:被设计为具有自我描述性. XML和HTML ...

  3. Asp.net缓存技术(HttpRuntime.Cache)

    一.缓存: 5个等级的缓存 1级是网络级缓存,缓存在浏览器,CDN以及代理服务器中   (举个例子:每个帮助页面都进行了缓存,访问一个页面的代码非常简单) 2级是由.net框架 HttpRuntime ...

  4. hashMap4种遍历方式

    package collection; import java.util.Collection; import java.util.HashMap; import java.util.Hashtabl ...

  5. 大型ERP系统在线体验

    ERP简单说明: AIO7构建了基于SOA三层架构的管理软件平台.客户通过网络即可得到ERP服务,不用安装服务器.不用建立数据中心.不用安装软件.无需专业IT支持,任何上网设备就可以使用高性能.功能集 ...

  6. VS.NET2010水晶报表安装部署[VS2010]

    水晶报表VS2010版IDE安装标准版SAP Crystal Reports, version for Visual Studio 2010 - Standard: 下载地址: http://down ...

  7. Flume-ng源码解析之Sink组件

    作为启动流程中第二个启动的组件,我们今天来看看Sink的细节 1 Sink Sink在agent中扮演的角色是消费者,将event输送到特定的位置 首先依然是看代码,由代码我们可以看出Sink是一个接 ...

  8. (九)javaScript的基本使用

    <script type="text/javascript"> var userName; var userAge; function interInfo(){ use ...

  9. Scrapy 初体验

    开发笔记 Scrapy 初体验 scrapy startproject project_name 创建工程 scrapy genspider -t basic spider_name website. ...

  10. Solr vs. Elasticsearch谁是开源搜索引擎王者

    当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求.随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战.本文,我们 ...