导航

c++虚函数

Posted on 2017-11-23 17:58  困或  阅读(306)  评论(0编辑  收藏  举报

1.虚函数

  [1]使用基类的指针和引用指向派生类对象时,调用的虚函数是动态绑定的,该绑定基类的函数还是派生类的函数是根据指向对象的真实类型决定的。这个要注意的就是基类的指针或引用,如果是非指针非引用,则就是静态绑定。例如某个函数返回的基类指针根据运行时输入参数不同返回各种派生类对象,然后再用这个基类指针调用函数,就需要动态绑定。

  [2]基类中的虚函数,在派生类中默认也是虚函数,这意思就是派生类中覆盖基类虚函数时,默认是加了virtual关键字的。

  [3]当派生类中覆盖了某个虚函数时,形参必须一样,但是不一样也是可以编译过的,编译器会当成两个独立的函数对待,但是这样容易发生错误。所以可以用override关键字进行显示覆盖,例子如下:

class a{
    int aa;
    virtual void fun1();
    virtual void fun2();
    void fun3();
    virtual void fun4() final;
};

class b : public a
{
    void fun1() override;           //正确
    void fun2(int) override;        //错误,参数不相同
    void fun3(int) override;        //错误,fun3不是虚函数,不能用override关键字

    void fun4();                    //错误,final虚函数不能再覆盖了
};

  [4]总结:虚函数的目的就是实现多态(多态就是一个接口可以调用多个方法),基类指针可以指向各种派生类或基类的对象,并且动态调用对象的虚函数。具体做法就是声明基类的指针,然后让该指针指向任意一个派生类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话(即没有利用C++多态性),则利用基类指针调用相应的函数的时候,将总被限制在调用基类函数本身,而无法调用到派生类中被覆盖过的函数。

2.虚函数和普通函数的区别

  [1]使用基类的指针和引用指向派生类对象时,调用的虚函数是动态绑定的,调用的非虚函数是静态绑定的(静态绑定是在编译器,动态绑定是在运行期)。 

  [2]由于虚函数在运行时才确定,所以必须为基类中所有的虚函数提供实现(注意是基类),而普通函数在不使用的情况下就不用实现。

3.虚函数和纯虚函数的区别

  [1]含有虚函数的类被称为抽象类,抽象类不能创建对象。

  [2]纯虚函数在基类中只有声明,但是不能在类内实现,可以在类外面实现,并且纯虚函数必须在派生类中实现。一般纯虚函数是不在基类中实现的,当然实现了也可以通过[基类::虚函数()]的方式去调用基类的纯虚函数。

  [3]总结:纯虚函数其实就是接口,意思就是只声明好(可以在类外实现),让派生类必须去实现这个接口。