首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊下继承与多态的区别?

聊下继承与多态的区别?

作者头像
灿视学长
发布于 2021-05-28 07:10:24
发布于 2021-05-28 07:10:24
6.1K00
代码可运行
举报
文章被收录于专栏:灿视学长灿视学长
运行总次数:0
代码可运行

浅谈C++中继承与多态的区别

众所周知,C++有三大特性和五大原则,这三大特性分别是:封装、继承和多态。然而继承和多态这两个特性是许多人容易混淆的。

今天我们就来聊聊C++中继承和多态的区别。

看文章之前,别忘了关注我们,在我们这里,有你所需要的干货哦!


1.基础概念

(1)继承

指可以让某个类型的对象,获得另一种类型对象属性的方法。实际上就是类与类之间可以共用代码,实现代码重用。 继承支持按级分类的概念。它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。 继承的过程:从一般到特殊的过程。 实现继承的方式:可以通过 “继承”(Inheritance)和“组合”(Composition)来实现。

与继承相关的类类型:

基类:被继承的类,即"父类"或“超类”。

派生类:基于基类创建的新类,又称“子类”。派生类可以访问基类中所有的非私有成员。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//派生类创建格式:
 class derived-class : access-specifier base-class
 /*
  ①access-specifier表示继承类型。我们几乎不使用 protected 或 private 继承,通常使用 public    继承。若如果未使用访问修饰符 access-specifier,则默认为private。
  ②base-class表示已有基类
 */

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 基类
 class Animal {
   // eat() 函数
   // sleep() 函数
 };

//派生类
 class Dog : public Animal {
   // bark() 函数
 };

继承几种类型:继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。

private:私有继承

基类private成员 不能继承 基类public、protected成员,可以继承,在派生类中需要通过private访问

protected:保护继承:

基类private成员 不能继承 基类public成员,可以继承,在派生类中相当于是protected访问 基类protected成员,可以继承,在派生类中相当于是protected访问

public:公有继承:

基类private成员 不能继承 基类public成员,可以继承,在派生类中相当于是public访问 基类protected成员,可以继承,在派生类中相当于是protected访问

派生方式

基类的public成员

基类的protected成员

基类的private成员

派生方式引起的访问属性变化概括

private派生

变为private成员

变为private成员

不可见

基类的非私有成员都成为派生类的私有成员

protected派生

变为protected成员

变为private成员

不可见

基类的非私有成员在派生类中的访问属性都降一级

public派生

仍为public成员

仍为protected成员

不可见

基类的非私有成员在派生类中的访问属性保持不变

(2)多态

按字面的意思就是多种形态,指一个类实例的相同方法在不同情况下有不同表现形式。 多态机制使内部结构不同的对象可以共享相同的外部接口。即子类可以重写父类的某个函数,从而为这个函数提供不同于父类的行为。一个父类的多个子类可以为同一个函数提供不同的实现,从而在父类这个公共的接口下,表现出多种行为。 多态的使用场景:当类之间存在层次结构,并且类之间是通过继承关联时。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

在C++中,多态性的实现和联编(也称绑定)这一概念有关。主要分为静态联编动态联编两种

  • 静态联编支持的多态性 称为编译时多态性(静态多态性)。在C++中,编译时多态性是通过函数重载和模板实现的。利用函数重载机制,在调用同名函数时,编译系统会根据实参的具体情况确定索要调用的是哪个函数。
  • 动态联编所支持的多态性 称为运行时多态(动态多态)。在C++中,运行时多态性是通过虚函数来实现的。

再举一个通俗易懂的例子:比如购买车票,普通人是全价票;学生是半价票等。

多态实现的三个条件:

①必须是公有继承 ②必须是通过基类的指针或引用 指向派生类对象 访问派生类方法 ③基类的方法必须是虚函数,且完成了虚函数的重写

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//tips:虚函数指在类的成员函数前加**virtual**关键字。
#include <iostream> 
using namespace std;

// 基类
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

// 派生类
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};

// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
 
   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();
   
   return 0;
}

运行结果:Rectangle class area

(Tips:shape中的area函数若没有用virtual定义,则无法实现调用派生类中area函数的目的)

2.继承和多态的区别

区别:

1.多态的实现要求必须是共有继承。

2.继承关系中,并不要求基类方法一定是虚函数。而多态时,要求基类方法必须是虚函数。

3.多态:子类重写父类的方法,使得子类具有不同的实现。且运行时,根据实际创建的对象动态决定使用哪个方法。

总结

在面向对象过程中,通常我们会以多个对象共有的特性作为基类进行创建。然后利用继承的特性,对基类进行派生。

基类与派生类存在相同的方法,但是有不同的方法体。当调用这些方法体时就需要利用C++的多态性质,根据对象的特性有选择的对方法进行调用。即多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。

其它干货

  • 算法岗,不会写简历?我把它拆开,手把手教你写!
  • (算法从业人员必备!)Ubuntu办公环境搭建!
  • “我能分清奥特曼们了,你能分清我的口红吗?”
  • 入门算法,看这个呀!(资料可下载)
  • 放弃大厂算法Offer,去银行做开发,现在...
  • 超6k字长文,带你纵横谈薪市场(建议工程师收藏!)

引用

  • https://blog.csdn.net/qq_37185716/article/details/75044620
  • https://www.runoob.com/cplusplus/cpp-inheritance.html
  • https://www.runoob.com/cplusplus/cpp-polymorphism.html

有趣的经验分享

  • 互联网的你们,还想要读博吗?
  • 挖年薪60w的腾讯同学来做技术VP
  • 算法岗,不会写简历?我把它拆开,手把手教你写!
  • (算法从业人员必备!)Ubuntu办公环境搭建!
  • 入门算法,看这个呀!(资料可下载)
  • 放弃大厂算法Offer,去银行做开发,现在...
  • 超6k字长文,带你纵横谈薪市场(建议工程师收藏!)

- END -

大家好,我是灿视。目前是位算法工程师 + 创业者 + 奶爸博士生时间管理者!

我曾在百度与腾讯担任算法工程师,我在19,20年连续推出两版《百面计算机视觉》,帮助了数百位同学们斩获了BAT等大小厂算法Offer。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灿视学长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++打怪 之 C++继承
继承 :表示两个类的关系,即通过已存在的类来创建一个新的类。其中已存在的类称为基类,新创建的类则称为派生类。
开源519
2020/11/03
7640
封装、继承、多态、重载:C++中的强大特性与代码设计
C++中的封装是一种面向对象编程的概念,它将数据(成员变量)和操作(成员函数)封装在一个类中,通过访问控制来限制对类内部实现的访问。封装提供了类与外部世界之间的接口,隐藏了类的内部实现细节,提高了代码的可维护性和安全性。
洁洁
2024/01/03
7580
C# 继承和多态
继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。
acc8226
2022/05/17
7840
c#中的多态学习总结
c#的多台方法,大体上和c++的类似,但是有点区别的,我这里刚刚初学,因此把重点记录下。
用户4645519
2020/09/07
9670
第十五章:C++访问控制权限、继承和多态详解
C++中的访问控制权限是面向对象编程的重要概念之一。通过访问控制权限,我们可以限制类成员的访问范围,以保护数据的安全性和封装性。本文将详细讲解C++中的访问控制权限,结合继承和多态,给出大量代码和实际案例。
GeekLiHua
2025/01/21
1920
《C++中的面向对象编程三大特性:封装、继承与多态》
在 C++编程的广阔世界中,面向对象编程(Object-Oriented Programming,OOP)的三大特性——封装、继承和多态,犹如三把强大的利器,帮助程序员构建出高效、可维护和可扩展的软件系统。本文将深入探讨如何在 C++中实现这三大特性,并通过具体的代码示例展示它们的强大之处。
程序员阿伟
2024/12/09
2570
☀️ 学会编程入门必备 C# 最基础知识介绍(五)——方法、封装、继承、多态
一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。每一个 C# 程序至少有一个带有 Main 方法的类。 要使用一个方法,您需要:
呆呆敲代码的小Y
2021/08/20
1.1K0
☀️ 学会编程入门必备 C# 最基础知识介绍(五)——方法、封装、继承、多态
C++ 重载运算符 继承 多态 (超详细)
(1)声明与定义格式 一般是类内声明,类外定义,虽然可以在类内定义,但 写前面堆一堆不好看!!! 类内声明:
风骨散人Chiam
2020/10/28
1.3K0
C++ 重载运算符 继承  多态 (超详细)
十、继承
C++中的继承是一种面向对象编程(OOP)的特性,它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。通过继承,派生类可以重用基类的代码,同时添加新的属性和方法或修改继承来的方法。这种机制促进了代码的复用、扩展和维护。
用户11332765
2024/10/28
2770
C++基础(七).多态(2)
代码示例 shape.cpp #include <iostream> //cout,endl 相关函数的声明 #define PI 3.1415926 //定义一个PI宏 using namespace std; //设定名称空间 class Shape //定义一个Shape的抽象基类 { public: virtual float getArea()=0; //声明一个纯虚函数 Shape(float x=0); //声明一个带默认参值的构造函数 protected: float h
franket
2021/09/15
4840
C++基础(七).多态(1)
C++语言是C语言的拓展,C语言是面向过程的,C++在C的基础上增加了面向对象的方法
franket
2021/09/15
5570
【深入浅出C#】章节 4: 面向对象编程基础:封装、继承和多态
封装、继承和多态是面向对象编程中的核心概念,它们对于构建灵活、可扩展和可维护的软件系统至关重要。 封装(Encapsulation)通过将数据和相关操作封装在一个类中,隐藏内部实现细节,并提供公共接口来与外部进行交互。封装有助于保护数据的完整性和安全性,同时提供了良好的抽象,使得代码更易于理解和使用。封装还可以支持代码的模块化和团队开发,各个模块之间可以独立开发和测试,提高了代码的可维护性和复用性。 继承(Inheritance)允许一个类继承另一个类的属性和方法,从而实现代码的重用和扩展。继承提供了代码的层次结构,使得相关的类可以组织在一起,并且可以通过继承实现代码的共享和统一的接口。继承还可以支持多态性,通过在子类中重写父类的方法,实现不同对象的不同行为。 多态(Polymorphism)允许同一操作在不同的对象上产生不同的行为。多态性提供了灵活性和扩展性,使得代码可以处理多种类型的对象,而不需要显式地针对每种类型编写不同的代码。多态性可以通过方法重写、方法重载和接口的使用来实现,它可以使代码更加灵活和可扩展,同时提高了代码的可读性和可维护性。
喵叔
2023/07/09
8700
【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”
注意:模板类继承另一个模板类时,基类的成员函数需要通过作用域限定符或this指针访问
换一颗红豆
2025/03/25
3570
【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”
C++多态与虚函数
SarPro
2024/02/20
2840
C++基础回顾03--多态
多态性意味着有多种形式。通常,多态发生在类之间存在层级关系且这些类有继承关系的时候。
软件架构师Michael
2023/08/09
2220
解锁C++多态的魔力:灵活与高效的编码艺术(上)
多态性是面向对象编程的重要特性之一,而C++通过虚函数、继承等机制实现了这一强大的功能。多态性使得代码更加灵活和可扩展,允许不同类型的对象以统一的方式进行操作。在本篇文章中,我们将深入探讨C++中多态的实现原理、使用场景及其优劣势,并通过具体代码示例展示如何利用多态来提升代码的可维护性和复用性。
suye
2024/10/18
4410
解锁C++多态的魔力:灵活与高效的编码艺术(上)
今天你学C++了吗?——C++中的多态
具体来说,运行时多态允许我们在完成某个行为(函数)时,传入不同的对象就会完成不同的行为,从而达到多种形态。假设我们正在开发一个图形绘制应用程序,该程序需要支持多种图形对象(如圆形、矩形和三角形)的绘制。我们可以设计一个基类Shape,并在其中定义一个虚函数draw()用于绘制图形。不同的图形对象(圆形、矩形和三角形)将作为Shape的派生类,并在这些派生类中重写draw()函数以实现各自的绘制逻辑。同样地,在动物叫声的模拟中,传入猫对象时发出“喵”的叫声,传入狗对象时发出“汪汪”的叫声,这也是通过多态性来实现的。
用户11352420
2025/03/16
3150
今天你学C++了吗?——C++中的多态
一文让你学完C++,干货收藏!!!
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
小林C语言
2020/04/03
3.4K0
从父类到子类:C++ 继承的奇妙旅程(1)
        在前文,小编讲述了C++模板的进阶内容,下面我们就要结束C++初阶的旅行,开始进入C++进阶容的旅c程,今天旅程的第一站就是C++三大特性之一——继承的旅程,各位扶好扶手,开始我们今天的C++继承的奇妙旅程。
用户11295429
2025/05/09
1490
从父类到子类:C++ 继承的奇妙旅程(1)
封装、继承与多态究极详解(面试必问)
继承是类与类之间的一种关系表现,我们知道除了继承,类之间的关系还可以有关联、依赖、实现、聚合、组合,为什么只强调继承?私以为实现是继承的特例,而其他四种关系都属于将类放在不同位置的灵活使用,且C中的结构体本身也具有这些特性,它并不是C++新创造出来的,但继承不一样,继承是新的需要提前约定的规则。
码事漫谈
2024/12/20
3220
推荐阅读
相关推荐
C++打怪 之 C++继承
更多 >
交个朋友
加入[后端] 腾讯云技术交流站
后端架构设计 高可用系统实现
加入前端工作实战群
前端工程化实践 组件库开发经验分享
加入云原生工作实战群
云原生落地实践 技术难题攻坚探讨
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档