“造地基”的C++ (九) 多态性

  • 运算符重载为类成员函数
  1. 运算符重载是针对新类型数据的实际要求,对原有运算符进行适当的改造
  2. 例如:

使复数类的对象可以使用“+”运算符实现加法

使时钟类对象可以使用“++”运算符可以实现时间增加1秒

      3.重载运算符通过函数来实现

      4.重载为类成员的运算符函数定义形式

函数类型  operator 运算符(形参) {  ........}  

参数个数=原操作数个数-1(后置++、--除外)

     5.双目运算符重载规则

如果要重载B操作符为类成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为A类对象,则B应被重载为A类的成员函数,形参类型应该是oprd2所属的类型

经重载后,表达式oprd1 B oprd2相当于oprd1.operator B (oprd2)

     6.前置单目运算符重载规则

如果要重载U为类成员函数,使之能够实现表达式U oprd,其中oprd为A类对象,则U应被重载为A类的成员函数,无形参

扫描二维码关注公众号,回复: 2682173 查看本文章

经重载后,U oprd相当于oprd.operator U()

     7.后置单目运算符++和--重载规则

   如果要重载++或--为类成员函数,使之能够实现表达式oprd++或oprd--,其中oprd为A类对象,则++或--应被重载为A类的成员函数,且具有一个int类型参数,用来区分前置

    经重载后,表达式oprd++相当于oprd.operator ++ (0)

 

  • 运算符重载为非成员函数的规则
  1. 函数的形参代表依自左至右次序排列的各操作数
  2. 重载为非成员函数时

参数个数 = 原操作数个数(后置++、--除外)

至少应该有一个自定义类型的参数

      3.后置单目运算符++、--的重载函数,形参列表中要增加一个int,但不必写形参名

     4.如果在运算符的重载函数中需要操作某类对象的私有成员,可以将此函数声明为该类的友元

 

  • 运算符重载为非成员函数的语法声明
  1. 双目运算符B重载后,表达式oprd1 B oprd2  等同于  operator B (oprd1, oprd2)
  2. 前置单目运算符B重载后,表达式 B oprd 等同于 operator B (oprd)
  3. 后置单目运算符++和--重载后,表达式 oprd B 等同于 operator B (oprd, 0)

 

  • 初识虚函数
  1. 用virtual关键字说明的函数
  2. 虚函数是实现运行时多态性基础
  3. C++中的虚函数是动态绑定的函数,运行时才知道它属于哪个对象
  4. 虚函数必须是非静态的成员函数,所以他是属于对象的函数,虚函数经过派生后,就可以实现运行时的多态

 

  • 一般成员函数和析构函数可以是虚函数,构造函数不能是虚函数

 

  • 一般虚函数成员
  1. 虚函数的声明:  virtual 函数类型 函数名(形参表);
  2. 虚函数的声明只能出现在类定义中的函数原型声明中,不能再成员函数实现的时候
  3. 在派生类中可以对基类成员函数 进行覆盖
  4. 虚函数一般不声明为内联函数,因为对虚函数的调用需要进行动态绑定,而对内联函数的处理是静态的

 

  • virtual关键字
  1. 派生类可以不显示的用virtual声明虚函数,这时系统会用以下规则来判断派生类的一个成员函数是不是虚函数:

该函数是否与基类的虚函数有相同的名称、参数个数及对应参数类型,或者是否有相同的返回值或者满足类型兼容规则的指针、引用型的返回值;

     2.如果从名称、参数及返回值三个方面检查后, 派生类的函数满足上述条件,就会自动确认为虚函数,这时,派生类的虚函数便覆盖了基类的虚函数

     3.派生类中的虚函数还会隐藏基类中同名函数的所有其他重载形式

     4.一般习惯于在派生类的函数中也使用virtual关键字,以增加程序的可读性

 

  • 虚析构函数

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

 

  • 虚表
  1. 每个多态类都有一个虚表(virtual table)
  2. 虚表中有当前类的各个虚函数的入口地址
  3. 每个对象有一个指向当前类的虚表的指针(虚指针vptr)

 

  • 动态绑定的实现
  1. 构造函数中为对象的虚指针赋值
  2. 通过多态类型的指针或调用成员函数时,通过虚指针找到虚表,进而找到所调用的虚函数的入口地址
  3. 通过该入口地址调用虚函数

 

  • 纯虚函数(带有纯虚函数的类就叫做抽象类)

纯虚函数是一个在基类中声明的虚函数,他在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本: virtual 函数类型 函数名(参数表) = 0;

 

  • 抽象类

带有纯虚函数的类就叫做抽象类,抽象类实例化对象,一般做基类使用

 

  • 抽象类作用
  1. 将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为
  2. 对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现
  3. 注意:抽象类只能作为基类去使用,不能定义抽象类的对象

 

  • Override

在派生类的成员函数中,如需覆盖基类中的虚函数,可以在派生类成员函数的前面加override关键字,这样的话,如果派生类中成员函数和基类中的想要覆盖的函数的函数签名不相同,在编译阶段编译器就会报错。

 

  • Final

在类名或者函数名后面加上final关键字,则表明该类或者该函数不能被继承或覆盖

 

 

猜你喜欢

转载自blog.csdn.net/ndliuning/article/details/81335525