c++ - 在子类中重写时我应该重用虚拟吗?

标签 c++ c++11

我知道我不需要在子类中将覆盖函数声明为 virtual。但是,如果我在子类中使用虚函数,是否需要将子类函数声明为 virtual

struct Base
{
    virtual int foo();
};

struct Derived : Base
{
    virtual int foo() override
    {
       // ...
    }
};

struct DoubleDerived : Derived
{
    int foo() override
    {
       // ...
    }
};

最佳答案

你不必,反正这个函数是虚拟的,但它无疑使它变得清晰。以前(在 override 可用之前)您可以覆盖某些函数,然后如果在基类中更改了该函数,您的派生类将不会再覆盖它并且代码将编译而不会出现任何问题。您在派生类中的函数不会覆盖任何东西,并且会变成非虚拟的。

override编译器会防止这种错误,如果基数改变,函数就不会神奇地变成非虚拟的。换句话说,如果 overridefinal被使用,暗示函数是virtual ,否则会编译错误。

关于c++ - 在子类中重写时我应该重用虚拟吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44103547/

相关文章:

c# - _NAME、__NAME、_NAME_、__NAME__ 等符号的含义

c++ - 在 jpeg/bmp/pdf 图像中搜索直线、圆和文本

c++ - 如果给定的模板参数提供类型定义,则使用 sfinae 启用构造函数

c++ - 为什么 uniform_int_distribution<uintmax_t> 适用于 62 位数字但不适用于 63 或 64 位数字?

c++ - c++11 中指针的 'auto' 类型分配是否需要 '*' ?

c++ - 如何使用 Clang 指定 C++17 中 utf-16 字符串文字的字节序?

c++ - 从 C++ .dll 到 Delphi Forms 应用程序的 PostMessage 问题

c++ std::ostringstream vs std::string::append

c++ - 匿名 union 中类成员的初始化

c++ - 将 boost::unordered_set 作为结果映射传递给 boost::split