C++的虚函数、多态以及多继承

一、虚函数

虚函数的定义

某基类中声明为virtual并在一个或多个派生类中重新定义的成员函数叫做虚函数。

虚函数的作用

原文链接:https://blog.csdn.net/m0_57706881/article/details/124542611

(1)如果基类中的某些函数被说明为虚函数,那么也意味着允许它的派生类去重新定义这个函数
(2) 如果基类的函数被声明为虚函数,那么在派生类中所有与这个函数原型相同的那些函数,自动成为虚函数!如果基类的某一个虚函数不希望被派生类覆盖,可以使用final来加以修饰。
(3) 当虚函数配合指针或引用使用时,能够实现多态效果!在定义了虚函数后,可实现在派生类中对虚函数进行重写,从而实现统一的接口和不同的执行过程。

拓展——虚继承

原文链接:Hello C++(十六)——多继承_c++多继承_天山老妖的博客-CSDN博客

在多继承中,保存共同基类的多份同名成员,可以在不同的数据成员中分别存放不同的数据,但保留多份数据成员的拷贝,不仅占有较多的存储空间,增加了成员的几余,还增加了访问的困难。C++提供了虚基类和虚继承机制,实现了在多继承中只保留一份共同成员。
C++对于菱形多继承导致的成员冗余问题的解决方案是使用虚继承。
虚继承中,中间层父类不再关注顶层父类的初始化,最终子类必须直接调用顶层父类的构造函数虚继承的语法:class 派生类名:virtual 继承方式 基类名

二、多态

原文链接:https://blog.csdn.net/m0_57706881/article/details/124542611

多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的方式来调用这些具有不同功能的同名函数。

多态可划分成两类:编译时的多态和运行时的多态。

编译时的多态是通过函数重载和运算符重载(重载采用的是静态连编)实现。(注意:函数重载实现的多态是一个类的行为的多态,要在同一个类内才能体现出来的多态,是面向方法的多态)。

运行时多态主要是通过虚函数和函数重写(虚函数采用的是动态连编)来实现的。(注意:虚函数可以实现继承的多态也可以实现非继承的多态,是面向对象的多态)。

在以继承方式实现运行时多态的时候,子类的同名函数必须修改其函数体并且在函数的前面最好加上一个virtual关键字,因为通过继承的方式实现多态的时候,系统通过会根据一些规则自动识别出子类的虚函数。不通过继承关系也可以实现运行时多态,这时两个不同类的函数名都需要加上virtual才行,而且定义的指针指向其他对象时,要进行强制转换

作用:在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即程序需要修改或增加功能时,只需改动或增加较少的代码。此外,使用多态也能起到精简代码的作用。

三、多继承

多继承即一个子类可以有多个父类,它继承了多个父类的特性,子类拥有所有父类的成员变量,子类继承所有父类的成员函数,子类对象可以当作任意父类对象使用。

语法:

class <派生类名> : <继承方式1><基类名1>,<继承方式2><基类名2>,…
  {
          <派生类类体>
  };

多继承下的构造函数

与单继承形式基本相同,只是在派生类的构造函数中调用多个基类的构造函数
以上面为例,派生类构造函数的写法为:

派生类(形参列表): 基类名1(实参列表), 基类名2(实参列表),

  {

        //其他操作

 }

命名冲突

当两个或多个基类有同名成员时,如果直接访问该成员,就会产生命名冲突,编译器不知道使用哪个基类的成员。这个时候需要在名字前面加上类名和域解析符::,以显示地指明到底使用哪个类的成员,消除二义性。例如:

BaseA::show(); //调用BaseA类的show()函数

BaseB::show(); //调用BaseB类的show()函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值