继承与多态之间的区别

作者: Laura McKinney
创建日期: 1 四月 2021
更新日期: 15 可能 2024
Anonim
12 虚函数与多态
视频: 12 虚函数与多态

内容


继承允许代码可重用,并且多态性是一种具有不同形式的函数的出现。继承和多态性之间的基本区别在于,继承允许已存在的代码在程序中再次重用,而多态性提供了一种机制,可以动态地决定要调用的函数形式。

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较表

比较基础遗产多态性
基本的继承是使用现有类的属性创建一个新类。从根本上讲,多态是多种形式的通用接口。
实作继承基本上是在类上实现的。多态性基本上是在函数/方法上实现的。
采用支持OOP中的可重用性概念并减少代码长度。允许对象决定何时在编译时(重载)以及运行时(重载)调用哪种形式的函数。
形式继承可以是单继承,多继承,多级继承,层次继承和混合继承。多态可以是编译时多态(重载)或运行时多态(重载)。
类表可以继承类家具的功能,因为表是一种家具。study_table类还可以具有set_color()函数,而Dining_table类也可以具有set_color()函数,因此,可以在编译时和运行时都决定要调用哪种形式的set_color()函数。

继承的定义:

继承是OOP的关键特征之一,它强烈支持“可重用性”。可重用性可以描述为通过重用现有类的属性来创建新类。在继承中,有一个基类,它由派生类继承。当一个类继承任何其他类时,基类的成员将成为派生类的成员。

继承类的一般形式如下:

类派生类名:访问说明符基类名{//类体};

在此,访问说明符提供对派生类的基类中的成员的访问方式(私有,公共,受保护)。如果没有访问说明符,则默认情况下将其视为“私有”。在C ++中,如果派生类为“ struct”,则访问说明符默认为“ public”。


在C ++中,继承可以通过五种形式实现。它们可以分为:-

  • 单一继承(仅一个超类)
  • 多重继承(几个超类)
  • 层次继承(一个超类,许多子类)
  • 多重继承(从派生类派生)

在Java中,该类通过使用关键字“ extends”继承另一个类。在Java中,基类称为超类,派生类称为子类。子类无法访问被声明为“私有”的基类成员。继承Java中类的一般形式如下。

类派生类名扩展了基类名{//类的主体};

Java不支持多重继承的继承,而支持多层层次结构。在Java中,有时超类可能希望隐藏其实现细节,并使该数据的某些部分“私有”。与Java中一样,子类无法访问超类的私有成员,并且如果子类想要访问或初始化那些成员,则Java提供了一种解决方案。子类可以使用关键字“ super”来引用其直接超类的成员。请记住,您只能访问直接超类的成员。

“超级”有两种一般形式。首先是,它用于调用超类的构造函数。第二个是,访问已被子类成员隐藏的超类成员。

//调用构造函数的第一种形式。 class supper_class {supper_class(argument_list){..} //超类的构造函数}; class sub_class扩展了supper_class {sub_class(argument_list){..} // sub_class super(argument_list)的构造方法; // sub_class调用超类的构造函数}};

//超类supper_class {int i; } class sub_class扩展了supper_class {int i; sub_class(int a,int b){super.i = a; // i属于超类i = b; //子类的}};

多态性的定义

多态性一词仅表示“一个功能,多种形式”。在编译时和运行时都可以实现多态。编译时多态性是通过“重载”实现的,而运行时多态性是通过“覆盖”实现的。

多态性允许对象在编译时和运行时都决定“何时调用函数的形式”。
让我们讨论重载的第一个概念。在重载中,我们多次在类中定义了具有不同数据类型和参数数量的函数,而要重载的函数必须具有相同的返回类型。在大多数情况下,重载的函数都是该类的构造函数。


类重载{int a,b; public:int重载(int x){//第一个重载()构造函数a = x;返回} int过载(int x,int y){//第二个过载()构造函数a = x; b = y;返回a * b; }; int main(){重载O1; O1.overload(20); //第一个重载()构造函数调用O1.overload(20,40); //第二个重载()构造函数调用}

现在,让我们讨论多态的第二种形式,即覆盖。覆盖的概念只能实现于类的功能,而类也要实现继承的概念。在C ++中,要覆盖的函数在基类中以关键字“ virtual”开头,并在派生类中使用相同的原型(关键字“ virtual”除外)重新定义。

class base {public:virtual void funct(){//基类cout的虚拟函数<<“这是基类funct()”; }; class named1:public base {public:void funct(){//基类的虚函数在derived1类中重新定义cout <<“” }; int main(){base * p,b;派生1 d1; * p =&b; p-> funct(); //调用基类funct()。 * p =&d1;返回0; }

  1. 继承正在创建一个从现有类继承其功能的类。另一方面,多态性是可以以多种形式定义的接口。
  2. 继承是在类上实现的,而多态性是在方法/函数上实现的。
  3. 由于继承允许派生类使用基类中定义的元素和方法,因此派生类不需要再次定义这些元素或方法,因此,可以说它提高了代码的可重用性,从而减少了代码的长度。另一方面,多态性使对象可以决定要在编译时和运行时调用哪种形式的方法。
  4. 继承可以分为单继承,多继承,多级继承,分层继承和混合继承。另一方面,多态被分类为重载和重载。

结论:

继承和多态是相互关联的概念,因为动态多态适用于也实现继承概念的类。