第五章 虚函数与多态性


1.联编
   ❶.静态联编
   ❷.动态联编


2.静态联编
   ❶.程序运行前的编译阶段,确定了函数属于哪个类
   ❷.格式:对象.函数名
   ❸.C语言中所有联编,均为静态联编;C++中一般情况下,均为静态联编


3.动态联编
   ❶.程序的运行阶段,确定函数(派生类的同名函数)属于哪个类

   ❷.格式:指针or引用,调用函数

   ❸.调用的函数 -> 是(virtual)虚函数(不能为构造函数,析构函数也可以) -> 体现多态性(派生类中,均有同名,内容可不同的该函数;基类中该函数前加了virtual,派生类中该函数前可加可不加virtual)


4.虚函数(继承关系中的函数,除构造函数外)
   ❶.基类的某个成员函数前 + virtual,定义为虚函数。意味着在子类中,也存在该函数,但是内容不同;子类中的该同名函数前,一般也 + virtual(可不加)

   ❷.程序调用时,根据 指针->对象 或 引用->对象,确定调用哪个类中的函数(例:不同员工发工资函数中的disp())

   ❸.相当于在,基类和派生类中,同名函数的重载,为方便调用,加virtual定义为虚函数,体现了多态性


5.虚函数实现多态性的条件
   ❶.类之间为 继承关系,满足赋值兼容性原则(public继承)
   ❷.改用了同名的虚函数 (基类和派生类中)
   ❸.根据赋值兼容性原则使用指针或引用


6.什么情况下要定义为虚函数
   ❶.子类需要继承该函数,并且希望在子类中更改该函数的功能,定义为虚函数
     (若子类继承该函数后,功能不变或不用该函数,不需要定义为虚函数)

   ❷.调用函数时,若通过基类指针或引用去访问该函数,定义为虚函数

   ❸.成员函数才能定义为虚函数,构造函数、全局函数、静态成员函数不能定义为虚函数


7.虚析构函数
   ❶.问题:派生类的对象从内存中撤销时,一般先调用派生类的析构函数,再调用基类中的析构函数;但是,如果用new运算符,建立派生类对象时,且定义了一个基类的指针指向该对象,当用delete运算符撤销时,系统进执行基类中的析构函数,不执行派生类中的析构函数,无法对派生类对象进行真正的撤销清理操作

   ❷.格式:virtual + 析构函数

   ❸.若基类中析构函数中定义为虚析构函数,则所有派生类的析构函数自动成为虚析构函数,即使函数名不相同

   ❹.当基类的析构函数为虚析构函数时,无论指针指向哪个派生类的成员函数,系统动态联编,调用正确的析构函数


8.纯虚函数
   ❶.格式:virtual 类型 函数名 = 0;
   ❷.理解:基类中未定义该函数具体内容,仅在基类中占一个名字,派生类中有具体实现

9.抽象类
   ❶.是一个类,包含纯虚函数的类
   ❷.如果派生类中,给出纯虚函数的具体实现,该派生类不再是抽象类;反之,只要派生类中仍有纯虚函数,则该派生类也称为抽象类
   ❸.抽象类中 至少含有一个虚函数,至少一个虚函数为纯虚函数

猜你喜欢

转载自blog.csdn.net/qq_40757747/article/details/81591855