EasyC++,多态

开发 后端
通常我们会将析构函数也设置成虚方法,因为派生类当中往往有一些专属成员,这是一种惯例。因为如果析构函数不是虚函数,那么只会调用对应指针类型的析构函数,这意味着可能在一些情况下产生错误和问题。

[[442919]]

多态

在我们之前介绍的继承的情况当中,派生类调用基类的方法都是不做任何改动的调用。

但有的时候会有一些特殊的情况,我们会希望同一个方法在不同的派生类当中的行为是不同的。举个简单的例子,比如speak方法,在不同的类当中的实现肯定是不同的。如果是Human类,就是正常的说话,如果是Dog类可能是汪汪,而Cat类则是喵喵。

在这种情况下只是简单地使用继承是无法满足我们的要求的,最好能够有一个机制可以让方法有多种形态,不同的对象去调用的逻辑不同。这样的行为称为多态。

这里稍微强调一下,多态是一种面向对象的设计思路,本身和C++不是强绑定的,其他语言当中一样有多态,只不过实现的方式可能有所不同。

在C++当中有两种重要的机制用于实现多态:

  • 在派生类当中重新定义基类的方法
  • 使用虚方法

我们来看一个例子:

  1. class Mammal { 
  2.  private: 
  3.   string name
  4.  public
  5.   Mammal(string n): name(n) {} 
  6.      string Name() const{ 
  7.             return name
  8.         } 
  9.   virtual void speak() const { 
  10.    cout << "can't say anything" << endl; 
  11.   } 
  12.      virtual ~Mammal() {}; 
  13. }; 
  14.  
  15. class Human : public Mammal{ 
  16.  private: 
  17.   string job; 
  18.  public
  19.   Human(string n, string j): Mammal(n), job(j) {} 
  20.   virtual void speak() const { 
  21.    cout << "i'm human" << endl; 
  22.   } 
  23. }; 

由于示例比较简单,所以我们把类的声明和实现写在一起了。

从结构上来看,这就是一个简单的继承,我们实现了两个类,一个叫做Mammal,一个叫做Human,然后给它们各自定义了一些成员变量。

值得注意的是speak函数,我们在函数声明前面加上了一个关键字virtual,这表示这是一个虚函数。

方法被定义成虚方法之后,在程序执行的时候,将会根据派生类的类型来选择执行的方法版本。在进行调用的时候,程序是根据对象类型而不是引用和指针的类型来选择执行的方法,如:

  1. Mammal *m = new Human("man""spiderman"); 
  2. m->speak(); 

这里我们用一个Mammal的指针指向了一个Human类型的对象,当我们调用方法的时候,由于speak方法是一个虚方法。因此执行的时候程序会根据对象的类型也就是Human去执行Human对象中的speak方法,而不是Mammal中的。

通常我们会将析构函数也设置成虚方法,因为派生类当中往往有一些专属成员,这是一种惯例。因为如果析构函数不是虚函数,那么只会调用对应指针类型的析构函数,这意味着可能在一些情况下产生错误和问题。

在上述的示例当中,我们是将类方法的实现和声明写在一起了,如果还是采取和之前一样分开实现的方式,需要注意我们无需在函数签名中加上virtual关键字。

本文转载自微信公众号「Coder梁」,可以通过以下二维码关注。转载本文请联系Coder梁公众号。

 

责任编辑:武晓燕 来源: Coder梁
相关推荐

2021-12-12 18:13:54

C++This指针

2021-11-26 00:03:20

C++编译常量

2021-12-09 10:56:50

函数C++原型

2021-12-08 10:43:09

C++实现

2021-12-30 14:58:58

C++函数动态

2021-12-10 10:45:36

C++函数Stock

2021-10-26 00:19:51

C++结构体存储

2021-11-27 11:50:09

C++静态持续

2021-12-11 19:02:03

函数C++对象

2021-11-09 10:38:16

C++Const指针

2021-11-10 10:48:36

C++函数指针

2022-01-04 16:35:42

C++Protected关键字

2021-12-05 18:20:42

C++空间特性

2021-10-27 16:27:20

C++指针操控

2021-12-15 10:25:57

C++运算符重载

2021-10-26 15:36:17

C++枚举值类型

2021-12-16 10:40:11

C++运算符重载

2021-12-26 00:08:35

C++初始化列表

2021-11-26 10:56:28

C++存储持续性

2021-10-21 18:52:00

C++数组存储
点赞
收藏

51CTO技术栈公众号