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