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"
};

有时基类的虚方法本不该被调用,只是为了实现基类指针调用子类方法。

纯虚函数是最好的。

 

纯虚函数

纯虚拟函数不需定义其实际动作,它的存在只是为了在衍生类别中被重新定义,只是为 了提供一个多态接口。

只要是拥有纯虚拟函数的类,就是抽象类。不能实例化。

如果子类没有重写基类的纯虚拟函数,那么子类也是一个拥有纯虚函数的类(抽象类)。

 

posted @ 2021-03-29 13:21  卡卡什么卡  阅读(64)  评论(0编辑  收藏  举报