C++:动态多态(虚函数+继承)

关键字 “virtual”:

虚函数,加在函数前

class 类名:
{
    ...
    virtual 返回值类型 函数名(参数列表);
};

虚继承,加在继承方式前

//class      A   : virtual  public    B
  class 派生类类名:virtual 继承方式 基类类名

虚函数的引用:

虚函数在基类中声明后,其派生出的派生类均继承了其虚函数的特性,在函数调用基类的引用时,由具体的参数对象,调用对象的虚函数,实现多态性。

虚函数说明:

  1. 只有类的成员函数可以定义为虚函数,非类的成员函数不能
  2. 构造函数无法定义为虚函数,析构函数可以定义为虚函数
  3. 虚函数一般不能声明为内联函数,虚函数的调用采用动态绑定,内联函数采用静态绑定,虽然虚函数在类内定义(默认为内联函数),但是虚函数作为特例,C++编译器也将它视为非内联函数
  4. 声明函数时加 “virtual" ,定义时不加 ”virtual"
  5. 作为基类的成员函数被声明为虚函数时,其派生类可以继承其同名虚函数,派生类成员函数前 “virtual" 关键字推荐加上,使得程序清晰明了
  6. 派生类没有重新覆盖同名虚函数,则自动继承其基类虚函数
  7. 派生类的虚函数若返回值、函数名、参数列表、const 限定与基类的虚函数不一致时,无法实现函数覆盖,其作用等同于添加新函数或进行函数重载

虚函数动态是实现动态多态的基础,传入什么类型的对象则调入该对象对应的函数

代码引例:

//动态多态,(虚函数)
#include <iostream>
#include <string>
using namespace std; 


class Shape
{
public:
	virtual void show()
	{
		cout << "这是图形" << endl;
	}
};

class Circle:public Shape
{
public:
	virtual void show()
	{
		cout << "这是圆形" << endl;
	}
};

class Square :public Shape
{
public:
	virtual void show()
	{
		cout << "这是正方形" << endl;
	}
};

void test1(Shape& s)
{
	s.show();
}
int main()
{
	Shape s1;
	Circle c;
	Square s2;
	test1(s1);
	test1(c);
	test1(s2);
	return 0;
}

动态多态总结:

前提条件:

  • 含有继承派生关系
  • 子类覆盖父类的虚函数

注意事项:

  • 含有父类的引用、指针:”C++ 对象传参:推荐使用引用,其次指针“
  • 子类同名覆盖父类的虚函数(override),则要求子类函数:返回值类型、函数名、参数列表、const 限定 与父类虚函数一致。

区别(同名覆盖、同名隐藏):

  1. 同名覆盖,作用于虚函数:子类覆盖继承父类的虚函数,数据被覆盖后丢失
  2. 同名隐藏,作用于普通函数(虚函数),是子类隐藏父类的数据,未丢失

共同点:

子类实现与父类相同的函数(函数名、参数列表、返回值、const 限定),仅函数体内容改变

函数重载与二者区别:

函数重载是普通函数中,仅函数名和返回值与原函数一致,参数列表(参数个数、类型不同)、函数主体不同的函数,重载函数与原函数共存,数据均未丢失

C++11中的final和override说明符:

override:

格式:

virtual       void    show2 (int a, int b)  override     {};
虚函数关键字 函数返回值 函数名(  参数列表  ) 覆盖关键字  函数主体;

为了避免子类在覆盖过程中,与父类的参数不一致时出现误操作导致多态无法实现,override关键字添加在虚函数声明最后,它显式的告诉编译器,当前函数一定是覆盖基类中的虚函数

帮助我们判断该覆盖是否成功,错误时编译器报错提示

错误原因:函数名不一致

错误原因: 原父类的虚函数无const 限定

错误原因:无法覆盖非虚函数

错误原因:

1、参数列表不一致

2、返回值类型不一致 +参数列表不一致

final:

格式:

   void     f1     (int)     final;
返回值类型 函数名(参数列表) final关键字;

在虚函数后添加 “final” 关键字,标志着此次是对虚函数的最终覆盖,此后任何覆盖虚函数的操作都是错误的

  • 继68行,类B对虚函数的覆盖后添加关键字 “final”限定最终覆盖情况
  • 73行,对类B的覆盖与关键字“final" 冲突,导致错误
  • 78行,对类A的覆盖与类B 虚函数的限制无关,所以通过
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值