Effective Modern C++读书笔记:条款12

Aki 发布于 2023-01-10 234 次阅读


12为意在改写的函数添加override声明:

C++面向对象编程是围绕类、继承和虚函数的基础上演化出来的。

正是由于虚函数,使得通过基类接口调用派生类成为了可能,然而,虚函数需要满足以下条件:

  • 基类中的函数必须是虚函数
  • 基类和派生类中的函数名字必须完全相同(虚析构函数除外)
  • 基类和派生类函数形参必须完全相同
  • 基类和派生类函数常量性必须完全相同
  • 基类和派生类中的函数返回值和异常规格必须完全相同
  • 函数引用修饰词必须完全相同
class base
{ 
public: 
    virtual void f1(); 
    virtual void f2(int a); 
    virtual void f3() &; 
    void f4(); 
}; 


class derive : public base
{ 
public: 
    virtual void f1() const; 
    virtual void f2(unsigned int a); 
    virtual void f3() && 
    void f4(); 
}; 

以上例子中,四组函数均不满足虚函数的定义条件,但一些ide也许不会在编辑代码的步骤中对这些错误发出警告

由于虚函数的定义需要保证正确性,同时也比较容易写错,因此,C++11提供了override声明

class derive : public base
{ 
public: 
    virtual void f1() const override; 
    virtual void f2(unsigned int a) override; 
    virtual void f3() && override; 
    void f4() override; 
}; 

此时,编译器会检查所有与改写相关的问题,提醒开发者此虚函数声明有误,避免不小心写错

同时,override关键字仅仅在函数声明末尾才有用