【发布时间】:2020-04-17 20:30:32
【问题描述】:
真的有必要使用 either virtual 或 override吗?
我知道关于这个一般性主题有很多问题,例如:
- C++ “virtual” keyword for functions in derived classes. Is it necessary?
- Is the 'override' keyword just a check for a overridden virtual method?
- virtual? override? or both? C++
从这些以及其他标记为重复的内容(许多“重复”的答案包含至少对我来说是新的不同信息),我学到了一些东西(而且,我认为,大致为什么他们'是真的):没有虚拟的覆盖不会编译。没有覆盖的虚拟会编译,但如果你犯了一个错误并且你的方法签名不正确,编译器不会告诉你。
但是如果我省略 both 会发生什么?示例:
struct BaseClass {
int a_number() {
return 1;
}
};
struct DerivedClass : BaseClass {
int a_number() {
return 2;
}
};
这会编译,无论我实例化BaseClass 还是DerivedClass,a_number 都会返回适当的结果。所以它表现得好像我已经覆盖了这个函数。上面的代码有什么错误的原因吗?是向后兼容性问题,还是其他原因?
如果我在这里错过的相关问题之一直接回答了这个问题,我深表歉意,谢谢。
编辑:StackOverflow 一直将我指向C++ “virtual” keyword for functions in derived classes. Is it necessary? 问题,正如 Wyck 在下面所做的那样。我不认为它解决了我的问题,因为我在 cmets 中给了他/她,因为它们是暂时的,我将在这里重复: “我专门询问超类方法中的虚拟,而该帖子似乎是关于子类中的虚拟及其传播方式。下面接受的答案回答了我的问题,但我认为您的链接没有(它可能会回答这个问题适合在 C/C++ 方面更有经验的人,但我认为它无法回答像我这样来自 Python 和 Java 的新手)。”
重点:我认为这些问题是相关的,但并不相同。
我接受了 selbie 的回答,因为它是第一个回答我问题的成熟“答案”。 Wyck 的回答提供了很多有用的、更一般的信息。
【问题讨论】:
-
您得到了“正确答案”,因为编译器依赖于对象的静态类型。如果您有一个指向基类的指针,并且您尝试在属于派生类的对象上调用该函数,您将获得基类结果(要获得正确的结果,您需要虚拟)。 See here
-
@Wyck 也许我没有仔细阅读它,但我不这么认为。我特别询问超类方法中的
virtual,而该帖子似乎是关于子类中的virtual及其传播方式。下面接受的答案回答了我的问题,但我不认为您的链接可以回答(它可能会回答在 C/C++ 方面更有经验的人的问题,但我认为它不能回答来自 Python 和 Java 的新手,像我一样)。
标签: c++ class overriding virtual