C++11中override关键字使用

  • 什么是override?

    • override 是C++11引进的一个说明符,翻译为 覆盖 的意思。C++11 中的 override 关键字,可以显式的在派生类中声明,哪些成员函数需要被重写,如果没被重写,则编译器会报错。
  • override有什么用?

    • 在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明(declaration),而我们在实现时,就需要实现接口声明的所有方法。
    • 在程序中加override 关键字,可以避免派生类中忘记重写虚函数的错误。
    • 另一个典型应用就是在继承中使用,在子类中覆盖实现父类的方法。
  • 注意事项

    • 在派生类的成员函数中使用override时,如果基类中无此函数,或基类中的函数并不是虚函数,编译器会给出相关错误信息。
  • 相关代码示例

#include <iostream>
using namespace std;

// 没有使用override
class Base
{
    
    
public:
	virtual void foo() {
    
     cout << "Base::foo" << endl; }
	virtual void goo() {
    
     cout << "Base::goo" << endl; }
	// ...
};

class Derived : public Base
{
    
    
public:
	void foo() {
    
     cout << "Derived::foo" << endl; }
	void gao() {
    
     cout << "Derived::goo" << endl; } // 错误的将goo写成了gao,但编译器并不会给出提示
	// ...
};

/*
// 使用override
class Base
{
public:
    virtual void foo() { cout << "Base::foo()" << endl;}
    virtual void bar() { cout << "Base::bar()" << endl;}
    void goo() { cout << "Base::goo()" << endl;}
};

class Derived : public Base
{
public:
    // ok
    void foo() override { cout << "Derived::foo()" << endl;}
    
    // error: Derived::foo does not override. 子类重写父类的函数,两者函数声明不一致
    void foo() const override { cout << "Derived::foo()" << endl;}

    // error: Base::goo is not virtual  
    void goo() override { cout << "Derived::goo()" << endl; }

    // error: 将bar误写成了bao,且基类中没有名为bao的虚函数
    // 由于使用了override,编译器会报错误
    void bao() override { cout << "Derived::bao()" << endl;}
};
*/

int main(void)
{
    
    
	Derived d;
	d.foo();                  // Derived::foo
	d.goo();                  // Base::goo 没有具体的子类实现,这不是我们想要的结果
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/breadheart/article/details/112464639