实际上是否有必要使用其中 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++
从这些以及其他标记为重复项的内容中(许多“重复项”的答案包含至少对我来说是新的独特信息),我学到了一些东西(并且我认为,大致为什么它们是真的):没有 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/