继承定义

继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。

继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展。原来的类称为基类,继承的类称为派生类,他们的关系就像父子一样,所以又叫父类和子类。

一般格式如下:

class 派生类名 : 继承类型 基类名

派生类成员可以访问基类的public成员protected成员

三种继承方式

继承类型有三种,共有继承(public)私有继承(private)保护继承(protected)

共有继承:

共有继承的特点是基类成员在派生类中都保持原来的状态

  • 基类中的public仍为public,
  • 基类中的protected仍为protected,
  • 基类中的private仍为private;

私有继承:

私有继承的特点是基类中所有成员在派生类中都变为私有成员

  • 基类中的public,protected变为private,
  • 基类中的private仍为private;

保护继承:

  • 基类中的public变为protected,
  • 基类中的protected仍为protected,
  • 基类中的private仍为private;

private在派生类中依然存在,但不论以哪种方法继承基类,派生类都不能直接访问基类的私有成员。

继承方式 基类的public成员 基类的protected成员 基类的private成员
public继承 public成员 protected成员 private成员
protected继承 protected成员 protected成员 private成员
private继承 private成员 private成员 private成员

for example:

class Base {	//基类
public :
int pub;
private:
int pri;
protected :
int pro;
}; class A : public Base{ //public继承
public :
int a;
void init() {
a = pub; //可以,依然为public成员
a = pro; //可以,依然为protected成员
a = pri; //错误,基类的私有成员在派生类中是不可见的
}
}; class B : protected Base{ //protected继承
public :
int b;
void init() {
b = pub; //可以,变为protected成员
b = pro; //可以,依然为protected成员
b = pri; //错误,基类的私有成员在派生类中是不可见的
}
}; class C : private Base{ //private继承
public :
int c;
void init() {
c = pub; //可以,变为private成员
c = pro; //可以,变为private成员
c = pri; //错误,基类的私有成员在派生类中是不可见的
}
};
int x;
A a;
x = a.pub; //可以,public继承的public成员是public的,对对象可见
x = a.pro; //错误,public继承的protected成员是protected的,对对象不可见
x = a.pri; //错误,public继承的private成员是private的,对对象不可见 B b;
x = b.pub; //错误,protected继承的public成员是protected的,对对象不可见
x = b.pro; //错误,protected继承的protected成员是protected的,对对象不可见
x = b.pri; //错误,protected继承的private成员是private的,对对象不可见 C c;
x = c.pub; //错误,protected继承的public成员是private的,对对象不可见
x = c.pro; //错误,protected继承的protected成员是private的,对对象不可见
x = c.pri; //错误,protected继承的private成员是private的,对对象不可见
return 0;
  • public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也都是一个父类对象。
  • protetced/private继承是一个实现继承,基类的部分成员并非完全成为子类接口的一部分,是has-a的关系原则,所以非特殊情况下不会使用这两种继承关系,在绝大多数的场景下使用的都是公有继承。
  • class的默认继承是private的,struct的默认继承是public的。

C++继承(一) 三种继承方式的更多相关文章

  1. C++中的类继承(1) 三种继承方式

    继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程. ...

  2. C++的三种继承方式简述

    C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...

  3. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  4. c++三种继承方式public,protect,private

    C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...

  5. mfc 类三种继承方式下的访问

    知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...

  6. C++三种继承方式

    一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.

  7. c++中三种继承方式的区别

    public公有继承 protected保护继承 private私有继承 我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用. 公有继承时 ...

  8. C++ 中三种继承方式的理解

    一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下:   我们用代 ...

  9. C++中的三种继承方式

    1,被忽略的细节: 1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么? class Parent { }; class Child : public Parent ...

随机推荐

  1. [转]Blue Prism Interview Questions and Answers

    本文转自:https://www.rpatraining.co.in/blue-prism-interview-questions/ What is a Visual Business Object? ...

  2. js动态生成层方法 不懂得加QQ 2270312758

    我们在WEB开发时,很多时候往往需要我们 JavaScript 来动态建立 html 元素,动态的设置相关的属性.比方说我们想要建立一个 div 层,则可以使用以下代码实现.一.直接建立 functi ...

  3. Java笔记(day9~day10)

    继承: 好处:1.提高代码复用性:   2.让类之间产生关系,给多态提供了前提: 父类.子类 Java中支持单继承,不直接支持多继承,但对C++的多继承进行了改良 单继承:一个子类只能有一个直接复类 ...

  4. DevExtreme App 开发记要

        添加插件 除提供的标准插件外,可直接在config.xml中书写配置,然后编译模板,在后台能看到相关的插件了         无法显示百度地图 在IPHONE中正常加载地图,但在安卓中提示BM ...

  5. 报表平台对CRM系统价值几何

    CRM系统即客户关系管理系统,其利用信息科学技术实现市场营销.销售.服务等活动自动化,使企业能高效地为客户提供周到的服务,以提升客户满意度与忠诚度为目的的一种管理经营方式.而CRM报表平台作为一个枢纽 ...

  6. git-lfs插件

    Git本地会保存文件所有版本,对于大文件很容易导致仓库体积迅速膨胀 为了解决这个问题,Github在2015.4宣布推出Git LFS(Large File Storage),详见:Announcin ...

  7. 猴子选大王 (约瑟夫环)(c#)

    猴子选大王问题: 一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈, 从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子, ...

  8. Mysql事务与锁详解

    脏读: 不可重复读: 幻读: 锁: 表级别的意向锁为了提高效率, 我们能给一张表成功加上一个表锁的前提是:没有任何一个事务对这张表的某些行加了锁. 如果没有意向表锁: 如果现在要给一个表加上表锁. 如 ...

  9. redis数据库安装 redis持久化及主从复制

    ----------------------------------------安装redis-5.0.4---------------------------------------- wget h ...

  10. 记录Nginx代理的配置

    server { listen  80; server_name localhost; location / { root    /ect/share/nginx/html; index   inde ...