C++ 中私有继承、保护继承与公有继承
区别
下面通过一个示例来介绍三种继承的区别。
定义一个基类(假设为一个快退休的富豪):
class RichMan
{
public:
RichMan();
~RichMan();
int m_company;
private:
int m_money;
int m_car;
protected:
int m_house; };
- 公司是public的,那么他自己(基类),创业伙伴(友元),儿子(子类),其他人(外部)都可以访问。
- 钱和车子是private的,自己(基类),创业伙伴(友元)可以访问。儿子(子类)和外人都不给开。
- 房子是protected的,自己(基类),创业伙伴(友元)可以访问,儿子(子类)也可以访问,外人是不可以访问。
如今他要退休,希望寻找继承人。这里有三种继承方式:
1.公有继承:public
他的儿子继承了他:LittleRichMan类
class LittleRichMan :
public RichMan
{
public:
LittleRichMan();
~LittleRichMan();
};
经过public继承后,LittleRichMan的成员访问权限变成如下形式:
#include "RichMan.h"
class LittleRichMan :
public RichMan
{
public:
LittleRichMan();
~LittleRichMan();
int m_company;//仿佛
protected:
int m_house;//仿佛
};
也就是说,public成员保持不变,private成员不可见,protected成员也保持不变。
他的儿子继续开着公司,住着房子,但他爸爸的车子和钱是拿不到了。
继续,若采用私有(private)继承:
2.私有继承:private
class LittleRichMan :
private RichMan
{
public:
LittleRichMan();
~LittleRichMan();
private:
int m_company;//仿佛
int m_house;//仿佛
};
可以想象他的儿子是个自私的人,通过private的方式继承:public和protected变成了private。
自己占用了公司和房子,这样除了自己和友元,任何方式都不得访问。
最后,protected继承:
保护继承:protected
class LittleRichMan :
private RichMan
{
public:
LittleRichMan();
~LittleRichMan();
protected:
int m_company;//仿佛
int m_house;//仿佛
};
原先的public变成了protected,protected保持不变。这样,公司和房子是除了外人不可以访问,自己,友元,子类都可以访问。
谨慎使用private继承
在C++中。公有继承强调的是 “is-a” 的关系,即一个派生类可以当成一个基类来看待,属于同一类。例如:男人(子类)/女人(子类)都是人(父类)。
对于private继承而言,并不存在这样一种关系,为什么?
在private继承中,父类所有的成员在子类继承后都会变成private(私有)属性,纵使它们在父类中原本是protected或public属性。
采用private继承的意义
- Private继承意味着implement-in-terms-of(根据某物实现出)。若你让class D以private继承class B,你的用意是为了采用class B内已经备妥的某些特性,不是因为B对象和D对象存在有任何观念上的关系。
- private继承纯粹是一种实现技术(这就是为什么继承自一个private base class的每样东西在你的class 内都是private的:因为它们都只是实现枝节而已)。
- private继承意味着只有实现部分被继承,接口部分应略去。
- 如果D以privae继承B,意味着D对象根据B对象实现而得,再没有其他涵义了。
- Private继承在软件 “设计” 层面没有意义,其意义只及于软件实现层面。
C++ 中私有继承、保护继承与公有继承的更多相关文章
- C++继承:公有,私有,保护
前言 无论是在平时学习中还是还做项目之时,主要用到的继承都是 public 公有继承,因此,对protected private两者继承都不大了解! 今天,在看<Effective C++ 3e ...
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
各种继承方式: 特征 公有继承 保护继承 私有继承 公有成员变为 派生类的公有成员 派生类的保护成员 派生类的私有成员 保护成员变为 派生类的保护成员 派生类的保护成员 派生类的私有成员 私有成员变为 ...
- 【转】c++继承:公有、私有、保护
原文链接:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html 公有继承(public).私有继承(private).保护继承(pro ...
- C++继承:公有,私有,保护(转)
公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时, ...
- c++继承:公有、私有、保护(对应p12访问限制)
公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时, ...
- C++ 公有继承、保护继承和私有继承的对比
在c++的继承控制中,有三种不同的控制权限,分别是public.protected和private.定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类是默认public ...
- c++ 多继承 公有,私有,保护
昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...
- C++公有继承,私有继承和保护继承的区别
昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...
- C++中公有继承、保护继承、私有继承的区别
公有继承时基类中各成员属性保持不变,基类中private成员被隐藏.派生类的成员只能访问基类中的public/protected成员,而不能访问private成员:派生类的对象只能访问基类中的publ ...
随机推荐
- react基础篇入门组件
讲述一下React: 1.声明式设计-React采用声明范式,可以轻松描述应用 2.高效-React通过DOM模型,最大限度的减少dom的交互 3.灵活-React可以与已知的库或框架很好的配合 4. ...
- JAVA_SE基础——48.多态
面向对象程序设计的三个特点是封装.继承和多态.前面已经学习了前两个特点.本章节将介绍多态性. 多态:一个对象具备多种形态.(父类的引用类型变量指向了子类的对象)或者是接口 的引用类型变量指向了接口实现 ...
- java实现图片压缩
java实现图片压缩 package Test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io. ...
- Jquery blokckUI 快速入门
$("#btnSubmit").click(function() { $.blockUI({ message : $("#loginForm"), css : ...
- apigw鉴权分析(1-4)新浪微博开放平台 - 鉴权分析
一.访问入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博开放接口的调用,如 ...
- 【Java】0X003 面向对象
一. 什么是面向对象 都说Java是一门面向对象的语言,但什么对象?什么又是面向对象?以下都是我学到的知识和一点自己的理解. 对象是指包含属性和行为的主体. 比如,人有性别.血型.单眼皮或双眼皮等的特 ...
- Android fragment切换后onresume时报 Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim'
动态加载fragment以后,调用了remove方法移除Fragment,在返回来的时候报 Attempt to write to field 'int android.support.v4.app. ...
- spark2.1:flatMap的用法
代码示例: val sample_data_combine_result=List( (0,(List(FitModel(4022,1447.92,-8.38983306721434,2.0)),1) ...
- POJ-1125 Stockbroker Grapevine---Floyd应用
题目链接: https://vjudge.net/problem/POJ-1125 题目大意: 股票经纪人要在一群人中散布一个谣言,而谣言只能在亲密的人中传递,题目各处了人与人之间的关系及传递谣言所用 ...
- 告知服务器意图的http方法
1.GET 用来获取资源,返回已有的结果 2.POST 传输实体主体,返回处理过后的结果 3.PUT 向服务器传输文件,返回是否成功的状态码 4.DELETE 删除服务器文件,返回是否成功的状态码 5 ...