
在C++中,final和override是两个用于控制类继承和虚函数重写的特殊标识符。它们从C++11开始引入,帮助开发者编写更安全、更清晰的面向对象代码。虽然它们不是强制使用的,但合理使用能有效避免常见的继承错误。
override的作用是显式表明某个成员函数意在重写基类中的虚函数。如果该函数实际上没有重写任何基类虚函数(比如函数名拼错、参数不匹配或基类函数非虚),编译器会报错。
使用override可以防止因签名不一致导致的“意外隐藏”而非“重写”的问题。
示例:class Base {
public:
virtual void func(int x) { }
virtual void funcNoOverride() { }
};
class Derived : public Base {
public:
void func(int x) override { } // 正确:成功重写
// void func(double x) override { } // 错误:没有匹配的基类虚函数
void funcNoOverride() final; // 可以结合使用
};
如果没有写override,即使函数签名不匹配,Derived::func(double)也会被视为新函数,从而隐藏基类版本,容易引发逻辑错误。加上override后,这类错误会在编译期被发现。
立即学习“C++免费学习笔记(深入)”;
final可用于类或虚函数,表示“不可再被继承”或“不可再被重写”。
当用于类时,表示该类不能作为基类被继承:
class FinalClass final {
// ...
};
// class SubClass : public FinalClass { }; // 编译错误:不能继承final类
当用于虚函数时,表示派生类不能再重写这个函数:
class Base {
public:
virtual void foo() const;
virtual void bar() final; // 不允许在派生类中重写
};
class Derived : public Base {
public:
void foo() const override; // 合法
// void bar() override; // 错误:bar是final,不能重写
};
也可以在定义Derived类时使用final标记整个类:
class MostDerived final : public Derived {
// ...
};
// class Last : public MostDerived { }; // 错误:MostDerived是final
在一个虚函数上可以同时使用override和final,表示该函数重写了基类虚函数,并且不允许其子类继续重写。
class Base {
public:
virtual void doWork() { }
};
class Derived : public Base {
public:
void doWork() override final { } // 重写并禁止进一步重写
};
class FinalDerived : public Derived {
public:
// void doWork() override { } // 错误:doWork在Derived中是final
};
这种组合在设计稳定接口时非常有用,例如框架中某些核心行为只允许特定层级定制,之后不再开放修改。
基本上就这些。合理使用final和override,能让继承体系更健壮,减少运行时多态带来的隐性bug。它们虽小,但在大型项目中作用显著。
以上就是c++++中如何使用final和override关键字_final与override关键字使用详解的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号