C++ 类 : virtual and override, 或两者都不是?

标签 c++ class overriding virtual

实际上是否有必要使用其中 virtual override

我知道关于这个一般主题有很多问题,例如:

从这些以及其他标记为重复项的内容中(许多“重复项”的答案包含至少对我来说是新的独特信息),我学到了一些东西(并且我认为,大致为什么它们是真的):没有 virtual 的覆盖将无法编译。没有重写的虚拟将编译,但如果您犯了一个错误并且方法签名不正确,编译器不会告诉您。

但是如果我省略两者会发生什么?示例:

struct BaseClass {
    int a_number() {
        return 1;
    }
};
struct DerivedClass : BaseClass {
    int a_number() {
        return 2;
    }
};

编译后,a_number无论我实例化BaseClass,都会返回适当的结果或DerivedClass 。所以它的行为就好像我已经覆盖了该函数。上面的代码有错误吗?这是向后兼容性问题还是其他问题?

如果我错过的相关问题之一直接回答了这个问题,我深表歉意,谢谢。

编辑:StackOverflow 不断将我指向 C++ “virtual” keyword for functions in derived classes. Is it necessary?问题,正如威克在下面所做的那样。我不认为它解决了我的问题,因为我在评论中给了他/她,因为它们是暂时的,我将在这里重复: “我特别询问父类(super class)方法中的虚拟,而那篇文章似乎是关于子类中的虚拟及其传播方式。下面接受的答案回答了我的问题,但我认为您的链接没有回答(它可能回答了这个问题)对于在 C/C++ 方面更有经验的人来说,但我认为它不能回答像我这样来自 Python 和 Java 的新手)。”

要点:我认为这些问题是相关的,但不相同。

我已经接受了塞尔比的回答,因为这是第一个回答我问题的成熟“答案”。 Wyck 的回答提供了很多有用的、更一般的信息。

最佳答案

正如您所声明的那样(没有虚拟方法),在没有声明BaseClass::a_number的情况下virtual,在转换时是DerivedClass的实例返回为 BaseClass 不会调用 DerivedClass

中的实现

示例:

BaseClass* instance1 = new DerivedClass();
instance1->a_number();  // returns "1", even though the object is really an instance of Derived

如果 BaseClass 声明如下:

struct BaseClass {
    virtual int a_number() {
        return 1;
    }
};

然后以下代码将按您的预期工作

BaseClass* instance2 = new DerivedClass();
instance2->a_number();  // returns "2", virtual method invocation

override 关键字是可选的,但建议在 DerivedClass 中使用:

struct DerivedClass : BaseClass {
    int a_number() override {
        return 2;
    }
};

正如您已经观察到的,override 不会改变程序行为,但如果 a_number 没有在 BaseClass 中进行相同的声明,编译器将发出错误。它对于捕获拼写错误很有用。

关于C++ 类 : virtual and override, 或两者都不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59508044/

相关文章:

java - 我应该把不用的方法留在类里面吗?

c++ - 调用重写函数并使用基类中的重载变量

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 命令行实用程序可以比 C++ 更快吗?

c++ - C++ 类中的指针变得杂乱无章

python - Odoo 如何继承 Mail.Thread AbstractModel 并重写该类的函数?

c# - 如何覆盖 Contains()?

c++ - 使用模板模板参数时出错

c++ - C onnx header 找不到 OrtEnv 定义

python - 使 python 用户定义的类可排序、可散列