【跟学C++】面向对象三大特征——继承(Study20)
文章目录
- 1、了解继承
- 2、基类与派生类(父类与子类)
- 2.1、概念
- 2.2、案例展示
- 3、构造顺序与析构顺序
- 4、继承种类
- 4.1、私有继承
- 4.2、保护继承
- 4.3、多继承
- 5、总结
============================ 【说明】 ===================================================
大家好,本专栏主要是跟学C++内容,自己学习了这位博主【 AI菌】的【C++21天养成计划】,讲的十分清晰,适合小白,希望给这位博主多点关注、收藏、点赞。
主要针对所学内容,通过自己的理解进行整理,希望大家积极交流、探讨,多给意见。后面也会给大家更新,其他一些知识。若有侵权,联系删除!共同维护网络知识权利!
=======================================================================================
1、了解继承
关于继承,用一个简单通俗的案例说明:大家都知道飞机,那么飞机的种类有太多。
飞机都有起飞、降落、飞行等功能,但是不同种类的飞机也有差异,如果用C++以最简单的方式来模拟不同飞机,该如何去做?
之前介绍过类的思想,我们自然可以想到声明两个类。其中飞机Plane类里实现飞机的所有属性,指定飞机类中实现指定飞机的所有属性。
这种方法虽然有效,但是有些属性会在上每个类中重复实现,比如刚刚所说的起飞、降落、飞行等。因此,提出了一种更有效的方案,即继承。
继承:在基类中实现所有通用的功能,从同一个基类可以派生出相似的类,并且在每个派生类中单独实现其特有的属性,从而让每个类都独一无二。
2、基类与派生类(父类与子类)
2.1、概念
基类与派生类就如括号内所言:父类与子类。
从图中可以看出,这三个派生类均继承于基类。其中,基类也可以称作超类(父类);派生类也可以叫作子类。
基类 | 派生类 |
---|---|
鱼 | 草鱼、鲈鱼、武昌鱼、鲤鱼等。 |
鸟 | 麻雀、鹦鹉、燕子、乌鸦等。 |
因此,基类和派生类的关系就一目了然:基类可看做是派生类的总称,它具有派生类最基本的属性。派生类是在基类上的进一步升华,具有自定义的属性和功能。
2.2、案例展示
我们通过一个简单的案例先来了解下继承的相关流程与操作:
#include<iostream>
using namespace std;//基类
class Animal
{public:bool riverAnimal;//水中动物//公有属性void Lift() {if (riverAnimal)cout << "Life in river!" << endl;elsecout << "Life not in river!" << endl;}};//子类:鸟类class Bird: public Animal
{public:Bird() {riverAnimal = false;}};//子类:鸭类class Duck : public Animal{public:Duck() {riverAnimal = true;}};//子类:狗类class Dog : public Animal{public:Dog() {riverAnimal = false;}};int main() {Bird bird1;Duck duck1;Dog dog1;cout << "bird:";bird1.Lift();cout << "duck:";duck1.Lift();cout << "dog:";dog1.Lift();return 0;
}
3、构造顺序与析构顺序
之前的文章中学习了构造顺序与析构顺序,了解了在实例化对象时,会自动调用类的构造函数;销毁对象时,会自动调用析构函数。
关于构造顺序与析构顺序,可以回到这篇文章:【跟学C++】C++类与对象—构造函数—析构函数(Study10)
问题:
但是,如果Dog类是从Animal类派生而来的,创建Dog对象时,先调用Dog的构造函数还是Animal的构造函数?
另外,实例化对象时,成员属性是在调用构造函数之前还是之后实例化?
实际上,基类Animal在派生类Dog对象之前被实例化,因此,首先构造Dog对象的Animal部分, 这样实例化Dog部分时,成员属性就准备就绪,可以使用了。
总的来说,在实例化派生类Dog对象时,会先实例化基类Animal的成员属性,再调用基类Animal的构造函数; 再实例化派生类Dog的成员属性,最后调用派生类Dog的构造函数。
在实例化派生类对象时,构造顺序是:先实例化成员属性,再调用构造函数,自顶(基类)向下(派生类)完成。析构顺序是:自底(派生类)向顶(基类) ,调用析构函数。
4、继承种类
上面介绍的都是公有继承,比较基础的内容,但是继承还有其他的种类,针对不同的需求,可以设置不同继承方式。
4.1、私有继承
私有继承不同于公有继承,在指定派生类的基类时使用关键字private
,其基本语法如下:
class Base{//...基类成员属性与方法};class Derived : private Base{ //私有继承//...派生类的成员属性与方法};
私有继承意味着在派生类的实例中,基类的所有公有成员和方法都是私有的,不能从外部访问。即:即使是Base类的公有成员方法也只能被派生类使用,而不能通过实例化派生类对象来使用它们。
常见的私有继承案例:
基类 | 派生类 |
---|---|
Motor | Car(汽车,汽车有发动机) |
Moon | Sky(太空,太空有月亮) |
Animal | Zoo(动物园,动物园有动物) |
通过一个私有继承案例,了解一下:
#include <iostream>
using namespace std;class Motor //基类 发动机
{public:void SwitchIgnition()//点火开关{cout << "Ignition ON" << endl; //点火开关ON}void PumpFuel()//泵燃油{cout << "Fuel in cylinders" << endl;//气缸中的燃油}void FireCylinders()//消防气瓶{cout << "Vroooom" << endl;}
};//子类 汽车
class Car:private Motor // 私有继承
{public:void Move(){SwitchIgnition();PumpFuel();FireCylinders();}
};int main()
{Car myDreamCar;myDreamCar.Move();return 0;
}
Car类使用关键字 private
私有继承了Motor类,Motor类中的成员方法(函数)只能被Car使用,不能被Car类的实例化对象使用。
下面展示错误示例:
Car myDreamCar;
myDreamCar.SwitchIgnition();//不可以被Car类的实例化对象使用
4.2、保护继承
保护继承与公有继承有一定的差异,再声明派生类继承基类的时候使用关键字protected
,基本的语法如下:
class Base{//...基类成员属性与方法};class Derived : protected Base{ //保护继承//...派生类的成员属性与方法};
私有继承与保护继承的相似点:
● 保护继承也让派生类能够访问基类的所有公有和保护成员;
● 在继承层次结构外面,也不能通过派生类实例访问基类的公有成员。
随着继承层次结构的加深,保护继承与私有继承也有不同之处:
class Derived2: protected Derived
{// 派生类Derived2能够访问基类的所有公有和保护成员
};
使用保护继承,派生类Derived2能够访问基类的所有公有和保护成员。这在私有继承中是不被允许的。
通过下述案例来理解一下,RaceCar类保护继承了Car类,Car类保护继承了Motor类:
#include <iostream>
using namespace std;class Motor //基类 发动机
{public:void SwitchIgnition()//点火开关{cout << "Ignition ON" << endl; //点火开关ON}void PumpFuel()//泵燃油{cout << "Fuel in cylinders" << endl;//气缸中的燃油}void FireCylinders()//消防气瓶{cout << "Vroooom" << endl;}
};class Car :protected Motor //保护继承
{public:void Move(){SwitchIgnition();PumpFuel();FireCylinders();}
};class RaceCar :protected Car //保护继承
{public:void Move(){SwitchIgnition();PumpFuel(); FireCylinders(); }
};int main()
{RaceCar myDreamCar;myDreamCar.Move();return 0;
}
注释: Car类以保护方式继承了Motor类,而RaceCar类以保护方式继承了Car类, RaceCar:Move( )
的实现使用了基类Motor中定义的公有方法。能否经由中间基类Car访问终极基类Motor的公有成员呢?这取决于Car和Motor之间的继承关系。如果继承关系是私有的,而不是保护的,RaceCar 将不能访问Motor类的公有成员,编译器根据最严格的访问限定符来确定访问权。
4.3、多继承
多继承,顾名思义,即:一个类可以继承多个基类的特性。多继承语法如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{<派生类类体>
};
访问修饰符继承方式是public、protected 或private其中的一个,用来修饰每个基类,各个基类之间用','
逗号分隔。
#include <iostream>
using namespace std;// 基类 Shape
class Shape
{public:void setWidth(int w){width = w;}void setHeight(int h){height = h;}
protected:int width;int height;
};// 基类 PaintCost
class PaintCost
{public:int getCost(int area){return area * 80;}
};// 派生类
class Rectangle : public Shape, public PaintCost
{public:int getArea(){return (width * height);}
};int main(void)
{Rectangle Rect; //实例化对象 int area;Rect.setWidth(15);Rect.setHeight(21);area = Rect.getArea();// 输出对象的面积cout << "Total area: " << Rect.getArea() << endl;// 输出总花费cout << "Total paint cost: $" << Rect.getCost(area) << endl;return 0;
}
5、总结
最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,我也会及时更新,来督促自己学习进度。一开始提及的博主【AI菌】,个人已关注,并订阅了相关专栏(对我有帮助的),希望大家觉得不错的可以点赞、关注、收藏。
【跟学C++】面向对象三大特征——继承(Study20)相关推荐
- Java面向对象三大特征---继承
系列文章目录 Java面向对象三大特征-多态 Java面向对象三大特征-封装 文章目录 系列文章目录 前言 一.概念 二.举例说明 三.语句格式 三.为何要使用继承 四.super与this关键字 五 ...
- 面向对象三大特征---继承
继承的概念 继承是一种类与类的关系,就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性.相同的行为,继承是实现代码复用的一种方式,继承实现了面向对象模块的层次性.被继承的类叫做基类或父类, ...
- 面向对象三大特征——继承
继承 :子类继承父类,子类将得到父类的全部方法和Field,但不能获得父类的构造器,一个子类只有一个直接的父类,用 extends 关键字来实现. 1.子类将得到父类的全部方法 ?.这得分三种情况讨论 ...
- c 子类对象 访问父类对象受保护成员_面向对象三大特征: 继承
如果子类重写了父类的方法,子类对象又要使用父类的方法怎么办 继承 今日内容 所有的类都直接或者简洁的集成到了Object Object:祖宗类 概述 要定义的类属于已有类的一种时,可以将该类定义为已有 ...
- 面向对象第七章,内存的管理,面向对象三大特征封装、继承、多态
###1.内存管理:由JVM来管理的------了解 1)堆: 1.1)存储new出来的对象(包括实例变量) 1.2)垃圾:没有任何引用指向的对象 垃圾回收器(GC)不定时到内存中清扫垃圾, 回收过程 ...
- c++面向对象三大特征封装、继承和多态知识总结
面向对象三大特征:封装,继承,多态: 一.封装:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现:作用是便于分工和分模块,防止不必要的扩展: 二.继承:就是一种传承,可以把 ...
- c++局部对象是什么_面向对象三大特征: 封装
今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...
- 细说面向对象三大特征
一.软件设计的概况 1. 软件的生命周期 产品提出需求 分析以及规划 软件编码及其调试(自测,联调) 上测试环境,给测试人员测试(提bug) 上 linux 生产服务器(运维人员维护,修改bug,系统 ...
- Java基础:面向对象三大特征、五大原则
转载请注明出处:jiq•钦's technical Blog 面向对象三大特征: (1)封装(Encapsulation) 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可 ...
最新文章
- FeignClient源码深度解析
- ubuntu 命令收集
- leetcode874
- hcia是什么等级的证书_华为的HCNA,HCNP,HCIE认证证书都有什么用?
- 基于React开发范式的思考:写在Lesx发布之际
- 轻松理解UML用例图时序图类图的教程
- (转载) linux安装JDK
- JAVA关键字及作用
- NOIP2015运输计划
- 【无标题】外网访问esxi虚拟主机使用VMRC需要映射端口
- 多年测试经验分享:上市公司怎么进行安全测试
- oracle 进程cpu 高,oracle进程CPU占用太高
- SAP 用户没有下载数据到本地的权限
- 组合按键的软件设计(c语言)
- AI化身心脏病“专家” 为心脏健康保驾护航
- 值得收藏|基于全球切片解析标准TMS的瓦片规则
- bash xx.sh与sh xx.sh以及./xx.sh的区别
- 互联网寒冬,如何花三个月东山再起........
- 常用数据集/工具下载地址
- python绘制一份完美的中国地图