C++11-final和override

1.override关键字

  • 作用
    显式标记派生类中的函数是覆盖基类的虚函数。编译器会检查签名是否与基类虚函数一直,避免因签名不一致导致意外行为。
  • 使用场景
    • 在派生类中重写基类虚函数时,显式声明覆盖关系。
    • 防止因函数名拼写错误、参数类型不匹配或者常两性(const)不一致导致的错误覆盖。
  • 语法规则
    • 只能用于虚函数(基类必须有对应的virtual声明)。
    • 必须放在函数声明的末尾(在const或引用限定符之后)。
  • 示例
#include <iostream>

using namespace std;

class Base {
public:
    virtual void foo(int);
    virtual void bar() const;
};

class Derived : public Base {
public:
    void foo(int) override;         //正确:覆盖Base::foo(int)
    void foo(double) override;      //错误:基类无virtual void foo(double)
    void far() override;            //错误:常两性不匹配(基类的bar()是const)
};
  • 好处
    • 编译时检查:确保派生类函数正确覆盖基类虚函数。
    • 代码清晰:明确表达设计意图,便于维护。

2. final关键字

  • 作用
    • 标记类:禁止该类被继承。
    • 标记虚函数:禁止该虚函数在派生类中被进一步覆盖。
  • 使用场景
    • 设计不可扩展的类(如工具类、库的核心类)。
    • 终止虚函数的覆盖脸(确保某个实现在派生类中不再被修改)
  • 语法规则
    • 用于类:class ClassName final { ... };
    • 用于虚函数:virtual void func() final;
  • 实例
  /* 1.禁止类被继承 */
class Base final { /*...*/ };

class Derived : public Base { //错误: Base是final类,无法继承
	/* ... */
};
/* 2.禁止虚函数被重写 */
class Base {
public:
	virtual void foo() final; //声明final
};

class Derived : public Base {
public:
	void foo(); // 错误:Base::foo()是final,不可覆盖
};
posted @ 2025-03-05 23:52  ydqun  阅读(94)  评论(0)    收藏  举报