C++ 基础之虚函数和虚基类

C++ 基础之虚函数和虚基类

C++ 有别于 C ,比较重要的就是其抽象、封装、继承和多态等特性。多态又具体地体现在重载、虚函数和模板等等之上。

今天就和大家聊一聊虚函数和虚基类。

虚函数

我们来思考一个问题。假如子(派生)类 B 继承自父(基)类 A,现在有一个 A 类型的指针指向了 B,这时候指针只能调用 B 中继承自 A 的那一部分东西。那么,现在假设 B 中有一个和 A 中同名、同传入参数、同返回参数但是实现不同的方法,此时使用指针调用此方法名称,那么它调用的是基类中的方法呢还是派生类中的方法?

答案是:它调用的是基类中的方法,指针的类型决定了你调用方法的归属。如下例。
在这里插入图片描述

那么,我现在想让这个指针调用派生类的方法,可以吗?当然可以,你可以明确地指定调用的是哪个类下面的方法。当然,你也可以用虚函数。

有了虚函数,本质上,我们就可以在子类中重写基类中的成员函数。

虚函数是一个成员函数,在基类中在原有的基础上加virtual关键字声明即可,其在基类的实现可以在类外完成,不必再加virtual。虚函数定义举例如下:
在这里插入图片描述

我们发现,只要在基类中将函数定义成虚函数就可以了。这是因为,一旦把基类的成员函数定义为虚函数,由基类所派生出来的所有派生类中,该函数均保持虚函数的特性。也就是说,下面所有派生出来的子类,即使没有virtual关键字,它定义出来的同原型的函数都是虚函数。也就是说,在子类的同原型函数定义中,关键字virtual可以被省略。

另外,我们必须要在基类中使用虚析构函数,这是因为:

  • 这样才可能通过基类指针删除派生类对象。
  • 如果你打算允许其他人通过基类指针调用对象的析构函数(通过delete这样做是正常的),就需要让基类的析构函数成为虚函数,否则执行delete的结果是不确定的。

纯虚函数

在普通的虚函数后面加上=0这样就声明了一个纯虚函数。有纯虚函数的基类只做能被继承,而不能被实例化。纯虚函数对应的方法必须在派生类中被实现。
纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本。

虚基类

当派生类从多个基类派生,而这些基类又
有共同基类,则在访问此共同基类中的成
员时,将产生冗余(多条路径的定义是不行的),并有可能因冗余带来不一致性(二义性)。怎么办?答:虚基类。

虚基类主要用来解决多继承时可能发生的对同一
基类继承多次而产生的二义性问题。

虚基类怎么定义,看个例子就明白了。简单地说,就是在原来派生的基础上,在基类前面加上virtual关键字。

在这里插入图片描述
在这里插入图片描述

虚基类的说明是用在定义派生类时,写在派生类名的后面。

在派生类的对象中,同名的虚基类只产生一个虚基类子对象,而每个非虚基类产生各自的子对象。

©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页