c++ 虚函数
虚函数
如果用基类指针指向一个衍生类对象,透过基类指针只能调用基类所定义的成员函数。
要实现透过基类指针调用子类成员函数(多态),需要使用 virtual 关键字。
MFC 有两个十分十分重要的虚 拟函数:与document 有关的Serialize 函数和与view 有关的OnDraw 函数
动态绑定与静态绑定
c++的虚函数,编译器无法在编译时期判断到底调用哪一个函数,必须在执行时才能评估,这称为后期绑定(lata binding)或动态绑定(dynamic binding)。
c++的non-virtual函数,在编译时期就转换成一个固定地址的调用,这称为前期绑定(early binging)或静态绑定(static binding).
(这与我之前看的java虚拟机里java多态的实现基本一致。)
基类定义虚函数
// 1 空函数,定义后什么也不做 class CShape { public: virtual void display() { } }; // 2 无用的消息 class CShape { public: virtual void display() { cout << "Shape \n"; } }; // 3 纯虚函数 class CShape { public: virtual void display() = 0; // 注意"= 0" };
有时基类的虚方法本不该被调用,只是为了实现基类指针调用子类方法。
纯虚函数是最好的。
纯虚函数
纯虚拟函数不需定义其实际动作,它的存在只是为了在衍生类别中被重新定义,只是为 了提供一个多态接口。
只要是拥有纯虚拟函数的类,就是抽象类。不能实例化。
如果子类没有重写基类的纯虚拟函数,那么子类也是一个拥有纯虚函数的类(抽象类)。