首页 > 代码库 > c++虚函数详解

c++虚函数详解

一、动态绑定什么时候发生

当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用

二、派生类中的虚函数

当我们在派生类中覆盖了某个虚函数时,可以再一次使用virtual指出该函数的性质,但是这么做并非必须,因为一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数。

一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型即返回类型必须与被它覆盖的基类函数完全一致,除非当类的虚函数返回类型是类本身的指针或引用时。

在c++11标准中我们可以使用override来说明派生类中的虚函数。

class b{public:    virtual void f1(int)const;    virtual void f2();    void f3();};class d :public b{    void f1(int) const override;//准确    void f2(int) override;//错误,形参不一致    void f3() override;//错误,f3不是虚函数};

如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致,因为会调用基类的默认实参。

三、抽象基类

纯虚函数:无须定义,而虚函数必须要定义

含有纯虚函数的类是抽象基类,我们不能创建抽象基类的对象,在抽象基类的派生类中覆盖了纯虚函数,则派生类可以创建对象

四、虚析构函数

继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数。

如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针将产生未定义的行为,而且基类需要虚析构函数,此时并不一定需要拷贝和赋值操作。