它实际上是需要使用两种 virtual
或 override
?
我知道有关此一般主题有很多问题,例如:
从这些以及其他标记为重复的(对许多“重复”的答案至少包含了对我来说不陌生的独特信息)中,我学到了一些东西(我想大概是为什么它们是真实的) ):不带虚拟的覆盖将无法编译。无覆盖的虚拟将编译,但是如果您犯了一个错误并且没有正确的方法签名,则编译器不会告诉您。
但是,如果我都忽略了怎么办?例:
struct BaseClass {
int a_number() {
return 1;
}
};
struct DerivedClass : BaseClass {
int a_number() {
return 2;
}
};
a_number
无论我实例化BaseClass
还是,它都会编译并返回适当的结果DerivedClass
。因此,它的行为就好像我已经覆盖了该功能。上面的代码有错误的原因吗?是向后兼容的问题,还是更多?
如果在我错过的相关问题之一中直接回答了这个问题,我深表歉意,谢谢。
编辑:StackOverflow不断指出派生类中函数的C ++“虚拟”关键字。有必要吗?问题,就像Wyck在下面所做的那样。我不认为这解决了我的问题,因为我在评论中给了他/她,因为它们是暂时的,所以我在这里重复:“我特别在询问超类方法中的虚拟,而那个帖子似乎关于子类中的虚拟及其传播方式。下面接受的答案回答了我的问题,但我认为您的链接没有(它可能会为具有C / C ++经验的人回答这个问题,但我不认为它回答来自像我这样的Python和Java的新手)。”
重点是:我认为这些问题是相关的,但并不相同。
我已经接受了selbie的回答,因为这是第一个完整的“答案”回答了我的问题。Wyck的答案提供了许多有用的,更一般的信息。
如已声明的那样(没有虚拟方法),如果BaseClass::a_number
不声明virtual
,则将其实例DerivedClass
化为as时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
,则编译器将发出错误。这对于捕获打字错误非常有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句