第八章:多态性

主要内容:

      1.多态性

      2.运算符重载

      3.虚函数

      4.纯虚函数

      5.抽象类


多态实现:

  --函数重载

  --运算符重载

  --虚函数

限制:有些运算符是不可重载的,重载基本是改变操作对象,有基本类型转为user-defined类型。

实现机制:运算表达式==》运算符函数,运算对象==》运算符函数的实参

形式:1.重载为类成员函数,此时 参数个数=原操作数-1(后置++,--除外)

          2.重载为友元函数,此时  参数个数 = 原操作数个数,至少有一个用户自定义类型的形参。

声明形式:

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

       {

        .....

       }

 运算符成员函数的设计:

  1.双目运算符B

    oprd1 B oprd2

   若oprd1 是A类对象 则 oprd1 B oprd2 ==>> oprd1.operator B(oprd2)

   2.前置单目运算符U

    U oprd

    若oprd 为A类对象 ,U 被重载为A类的成员函数 则U oprd ==>> oprd.operator U() 

 3.后置单目运算符++、--

    oprd++ / oprd--

   若oprd为A类对象,++、--被重载为A类的成员函数,且具有一个int类型形参。则 oprd++ ==> oprd.operator++(0)

    为何要这样设计呢???如果不明白,虽然现在看懂了,过后还是忘得?????

  运算符友元函数设计:

   1.双目运算符B

     oprd1 B oprd2 ===> operator B(oprd1,oprd2)

    2.前置单目运算符B

    B oprd ===>operator B(oprd)

    3.后置单目运算符++、--

     oprd B ===>operator B(oprd,0)

    


静态绑定与动态绑定

   1.绑定: 程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。

   2.静态绑定(静态联编)

    编译阶段,用对象名或者类名来限定要调用的函数

    3.动态绑定

    运行阶段,程序运行时确定将要调用的函数

还是不太明白静态编译和动态编译的概念,到底是如何实现动态的编译呢?????


虚函数:

 本质:不是重载声明而是覆盖

 调用方式:根据指针指向的对象的类,而不是指针本身的类型。


虚析构函数:

 虚技术与析构函数的合体,这样可以用基类指针delete派生类得对象。


抽象类

只要含有纯虚函数的类就是抽象类

class 类名

{

   virtual 类型 函数名(参数表)=0;/纯虚函数

}

NOTE:

  抽象类只能作为基类来使用

  不能声明抽象类的对象

  构造函数能是虚函数,析构函数可以是虚函数(????)

还有一个疑问:为何构造函数不具有继承特性呢。析构函数呢?析构函数也不具有继承特性。但可以有虚析构函数

原文地址:https://www.cnblogs.com/chip/p/4771299.html