c++虚函数

1.虚函数ide

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

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

  [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++多态性),则利用基类指针调用相应的函数的时候,将总被限制在调用基类函数自己,而没法调用到派生类中被覆盖过的函数。code

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

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

  [2]因为虚函数在运行时才肯定,因此必须为基类中全部的虚函数提供实现(注意是基类),而普通函数在不使用的状况下就不用实现。接口

3.虚函数和纯虚函数的区别编译器

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

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

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

相关文章
相关标签/搜索