【问题标题】:Is there reverse of 'override' specifier in C++?C++ 中是否有“覆盖”说明符的反转?
【发布时间】:2017-01-25 15:32:09
【问题描述】:

override 关键字允许确保该函数将被覆盖。 我正在寻找反向功能。所以 - 当我编写一个新函数时 - 我想用一些东西标记它以确保它不会被意外覆盖。

(另外,我不想让它static,因为它看起来像是属于一个对象而不是类)

【问题讨论】:

  • 什么,比如the final specifier
  • 你想要final
  • afaik override 确保函数覆盖基类中的函数,而不是相反...如果我错了,请纠正我...
  • ...如果你想确保一个函数被覆盖,你必须让它抽象(即纯虚拟)
  • 如果您不希望某个函数被覆盖,请不要将其标记为virtual

标签: c++ c++11 inheritance overriding


【解决方案1】:

我想用一些东西标记它以确保它不会被意外覆盖。

您可以使用final specifiercppreference 中的示例:

struct Base
{
    virtual void foo();
};

struct A : Base
{
    void foo() final; // A::foo is overridden and it is the final override
    void bar() final; // Error: non-virtual function cannot be overridden or be final
};

【讨论】:

  • 我想确保我没有覆盖父类中的任何内容
  • final 仅对派生自我的类有帮助
  • @DraifKroneg:您可以将父类的方法标记为final。如果您无权访问父类的定义,则无法防止覆盖。
【解决方案2】:

如果不想在派生类中重写虚函数,可以使用final

指定不能在派生类中重写虚函数或不能继承类。

例如

struct Base
{
    virtual void foo() final; // foo cannot be overridden in the derived class
};
struct Derived : Base
{
    void foo();               // Error: foo cannot be overridden as it's final in Base
};

【讨论】:

  • 如果继承树中有数百个父类怎么办?我只是想确保我不会意外地覆盖那里的任何东西。我不能遍历所有这些并将它们中的每一个标记为最终的。我只想添加小函数并在它覆盖任何内容时获得快速编译错误。
  • 总而言之:'overrides' 关键字是我当前函数的本地关键字,而 'final' 需要在数百个类中对我进行可能的更改。它不一样 - 它做的事情与我所要求的完全不同。
【解决方案3】:

final 是您要查找的关键字。

备注:请注意,override 并没有像您所说的那样“确保函数将被覆盖”。 派生类中的override 确实确保您实际上覆盖了基类的方法,而不仅仅是引入了类似于基类的虚拟方法的新方法。

为了确保一个方法被覆盖,它在你的基类中必须是纯虚拟的。

另外,static 的工作方式正好相反:静态方法属于类,非静态方法需要调用对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多