多态性与继承:多态性与继承之间的区别 [2022]

已发表: 2021-01-05

多态和继承都是面向对象编程的基本概念。 在现代编程语言中添加对象对我们使用语言的方式以及我们能够用它们做的事情产生了相当大的影响。 简而言之,面向对象编程是一组允许程序员使用类并因此基于这些类派生对象的方法。

它旨在模拟现实世界的实体,并使程序员更容易使他们的代码包含他们编写代码的范式。基本上有四个面向对象的编程概念,即继承、抽象、多态和封装。 现在,如前所述,每一个想法都可以被认为是任何现代语言的支柱。

回到我们关于多态性与继承和权责的话题,我们看到了这两个概念之间的明显差异。 继承是允许代码在相同或不同程序中再次重用的概念。 我们甚至可以通过保留我们喜欢的东西并丢弃那些对我们试图完成的任务无用的东西来改变代码的行为方式。 继承节省了大量时间来开发我们现在在数字显示器上看到的几乎所有东西。

另一方面,多态负责指示已经编写的代码,并根据特定参数实时决定需要执行哪种代码。 在讨论多态性和继承之间的区别之前,首先详细了解每个概念对任何人都是有益的。 一旦我们知道继承和多态的确切含义,差异将变得更加明显。

从世界顶级大学获得软件工程学位获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

目录

遗产

在编程范式中不将继承视为一个非常重要的 OOP 概念将是一种犯罪。 继承的重要性绝不能掉以轻心,因为继承的目的是“可重用性”。 顾名思义,继承的作用是允许将编写在一个类中的代码扩展到另一个类。 因此,在继承中,存在一个基类; 编写代码的类将被重用。

我们将创建的下一个类必须从这个基类继承,才能使用与基类关联的所有函数和变量。 每当一个类获取另一个类的属性(或从不同类继承)时,基类中存在的所有成员都将成为这个新派生类的成员。

下面给出的示例代码将向您展示一般继承形式的样子。 这里要注意的一件关键事情是,您必须编写以启用代码继承的确切语法将完全取决于您选择的编程语言。

  1. 类派生类名:访问说明符基类名{
  2. // 派生类的主体
  3. }

在上面显示的示例中,某些事情需要稍微解释一下。 “访问说明符”一词表示派生类访问基类的属性和方法的方式。 通常有三个访问说明符,每个都有自己的含义(即私有、公共和受保护)和属性。

再一次,根据您选择的语言,您可能需要也可能不需要使用这些访问说明符。 因此,在 C++ 的世界中,如果您在默认情况下不指定任何内容进行继承,它就会变为私有。 但是,如果您从结构继承(通过关键字 struct),则默认访问说明符将是 public 而不是 private。

阅读: R 编程语言的职业机会

当您进行继承时,C++ 还为您提供了许多可供选择的选项。 您会在下面找到其中一些:

一种。 分层继承:这种类型的继承遵循的规则应该只有一个超类,并且从那个超类必须有许多派生的子类。 您将在下面找到它的一个示例:

  1. //基类
  2. A级
  3. {
  4. 公共无效乐趣A()
  5. {
  6. //
  7. }
  8. }
  9. //派生类
  10. B类:A
  11. {
  12. 公共无效乐趣B()
  13. {
  14. //
  15. }
  16. }
  17. //派生类
  18. C类:A
  19. {
  20. 公共无效函数C()
  21. {
  22. //
  23. }
  24. }
  25. //派生类
  26. D类:C
  27. {
  28. 公共无效funD()
  29. {
  30. //
  31. }
  32. }
  33. //派生类
  34. E类:C
  35. {
  36. 公共无效乐趣()
  37. {
  38. //
  39. }
  40. }
  41. //派生类
  42. F级:B
  43. {
  44. 公共无效funF()
  45. {
  46. //
  47. }
  48. }
  49. //派生类
  50. G类:B
  51. {
  52. 公共无效funG()
  53. {
  54. //
  55. }
  56. }

湾。 多重继承:如果你正在做多重继承,那意味着你只有一个从多个超类继承的派生子类。 您将在下面找到一个简单的多重继承示例:

  1. //基类
  2. A级
  3. {
  4. 公共无效乐趣A()
  5. {
  6. //
  7. }
  8. }
  9. //基类
  10. B类
  11. {
  12. 公共无效乐趣B()
  13. {
  14. //
  15. }
  16. }
  17. //派生类
  18. C类:A、B
  19. {
  20. 公共无效函数C()
  21. {
  22. //
  23. }
  24. }

C。 单一继承:这可能是最简单的继承形式。 只有一个基类和一个派生类。 您将在下面找到一个示例:

  1. //基类
  2. A级
  3. {
  4. 公共无效乐趣A()
  5. {
  6. //去做:
  7. }
  8. }
  9. //派生类
  10. B类:A
  11. {
  12. 公共无效乐趣B()
  13. {
  14. //去做:
  15. }
  16. }

多态性

多态性一词的基本定义意味着具有多种形式。 这个定义非常准确地解释了编程上下文中的多态性。 在这种范式中,多态性具有一种功能但多种形式的含义。 多态性实际上发生在编译时。 由于重载的概念,编译时的多态性才成为可能,而在运行时,覆盖的特性使多态性成为现实。 让我们一一解决重载和覆盖的定义。

重载要求您编写的代码或类的函数多次编写,具有不同的参数但具有相同的返回类型。 这意味着您传递给函数的参数可以不同,只需查看在运行时传递给函数的最终值,就可以决定调用哪种形式的函数。 通常,我们看到类构造函数是重载最多的函数。 所有这些理论都会变得更加清晰,并且借助示例更容易让您在脑海中根深蒂固。

  1. 类重载{
  2. 整数a,b;
  3. 民众:
  4. int重载(int x){ // 第一个重载() 构造函数
  5. a=x;
  6. 返回一个;
  7. }
  8. int重载(int x, int y){ //第二个重载() 构造函数
  9. a=x;
  10. b=y;
  11. 返回 a*b;
  12. }
  13. };
  14. 诠释主要(){
  15. 过载 O1;
  16. O1。 过载(20); //第一个重载()构造函数调用
  17. O1。 过载(20,40); // 第二次重载()构造函数调用

在这个例子中,我们看到了重载的作用。 根据对象的括号的最终值是一个整数还是两个,看看如何调用不同的构造函数。

让我们接下来解决 Overriding 的定义。 您只能对那些继承的特定功能执行覆盖。 是的,继承是使函数覆盖成为可能的关键点。 如果你想编写一个函数并重写它,在 C++ 中你必须在函数定义之前使用关键字 virtual,而在派生类中为你的函数使用相同的名称,只需删除 virtual 关键字。 为了巩固你的理解,这里有一个例子:

  1. 类基{
  2. 民众:
  3. virtual void funct (){ //基类的虚函数
  4. cout<<“这是一个基类的funct()”;
  5. }
  6. };
  7. 类派生1:公共基础{
  8. 民众:
  9. void funct (){ //派生1类中重新定义的基类虚函数
  10. cout<<“这是一个派生类的funct()”;
  11. }
  12. };
  13. 主函数
  14. {
  15. 基 *p, b;
  16. 派生1 d1;
  17. *p=&b;
  18. p->函数(); //调用基类func()。
  19. *p=&d1;
  20. 返回0;
  21. }

看看在基类中是如何使用关键字 virtual 的,在派生类中,相同的函数定义存在,只是关键字 virtual 不存在。

多态性和继承之间的一些显着差异:

  1. 继承本质上是创建一个类,然后让程序中的其他类从已经存在的基类中获取它们的特性。 然而,多态性是一个界面,因为是一个界面,它可以采取不同的形状和形式。
  2. 继承是仅与类有关的属性,而多态性将其自身扩展到任何方法和/或函数。
  3. 继承允许派生类使用基类中声明的所有函数和变量,而无需再次显式定义它们。 这就是为什么我们说继承增加了代码的可重用性并减少了代码的长度,如果没有继承,我们将不得不编写代码。 然而,多态性允许相同的函数名称具有两个非常不同的代码。 因此,从某种意义上说,多态性并没有减少我们必须编写的代码的长度,而是进一步扩展了它。
  4. 继承可以采取多种形式; 你可以通过继承真正发挥创造力。 然而,多态性只能通过两种方式来实现,即重载和覆盖。 在使用多态性时你仍然会非常疯狂,但是你只能通过两种方式在你的代码中实现它。

必读:必读 47 OOPS 面试问答

多态性与继承:表格分化

在下表中,您会发现多态性和继承之间的明显区别:

比较措施遗产多态性
两者的根本区别继承的含义是创建具有属性的新类(现有类的函数和变量) 它本质上是一个允许以不同形式编写代码的平台。
它们都可以集成到您的代码中的方式的差异只有类才能在代码中享受真正的继承。 它可以在整个代码中由任何函数和/或方法实现和使用。
两者可以使用的方式不同。 它使编写的代码能够在相同或不同的程序中重用。 没有它,面向对象的编程将缺少一个关键特性。 它允许声明的对象决定调用哪种形式的函数。 有两次可以决定这一点。 在运行时,它被称为覆盖; 在编译时,它被称为重载。
他们都可以采取不同的形式继承可以采取多种形式。 多态性只能有两种形式。 根据程序中的时间,它从重载变为覆盖。
一个基本示例,展示了它们中的每一个是如何实现的。 自行车类可以继承自两轮车辆类,而两轮车辆又可以是车辆的子类。 自行车类可以有一个名为 set_color() 的方法,它根据您输入的颜色名称更改自行车的颜色。

查看:什么是 Java 中的类型转换 | 作为初学者理解类型转换

结论

可以肯定地说,多态性和继承都是使任何程序成为现实的关键概念。 它们都是面向对象编程思想的基础。 多态性和继承之间存在许多差异,因为它们服务于两个非常不同的目的。

多态性允许程序员编写函数的多个定义。 同时,继承使用户能够重用已经编写好的代码。 为了充分理解和理解这两个概念,建议您进一步阅读这两个主题。

每当您编写代码时,您应该始终牢记的一件事是,如果您希望重构您已经编写的代码(基本上是一个类的定义并在您的代码中再次使用它来提供类似或不同的服务)目的),你应该利用继承。 如果您希望减少代码中的整体混乱并希望使用相同名称的函数来执行类似的任务,则应该使用多态性。

如果您有兴趣了解有关全栈软件开发的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发 PG 文凭,该文凭专为在职专业人士设计,提供 500 多个小时的严格培训、9 个以上的项目,以及任务、IIIT-B 校友身份、实用的实践顶点项目和顶级公司的工作协助。

立即规划您的软件开发职业。

申请 upGrad 的软件工程与工作相关的 PG 认证