C++ 在子类中重写时是否应该重用virtual?
我知道我不需要在子类中将重写函数声明为C++ 在子类中重写时是否应该重用virtual?,c++,c++11,C++,C++11,我知道我不需要在子类中将重写函数声明为virtual。但是如果我在子类中使用虚函数,我是否需要将子类函数声明为virtual struct Base { virtual int foo(); }; struct Derived : Base { virtual int foo() override { // ... } }; struct DoubleDerived : Derived { int foo() override {
virtual
。但是如果我在子类中使用虚函数,我是否需要将子类函数声明为virtual
struct Base
{
virtual int foo();
};
struct Derived : Base
{
virtual int foo() override
{
// ...
}
};
struct DoubleDerived : Derived
{
int foo() override
{
// ...
}
};
你不必这么做,不管怎么说,这个函数是虚拟的,但它毫无疑问地使它清晰明了。以前(在
override
可用之前),您可以重写某个函数,然后如果该函数在基类中发生更改,您的派生类将不再重写它,代码将在编译时不会出现任何问题。派生类中的函数不会重写任何内容,并且会变成非虚拟函数
使用编译器将防止此类错误,并且如果基发生更改,函数不能神奇地变为非虚拟函数。换句话说,如果使用或,则意味着函数为,否则将是编译错误。我刚刚发现状态:
Virtual functions should specify exactly one of virtual, override, or final.
虚拟函数作为指针存储在类的vtable中,并从中间接调用。任何一个半途而废的编译器都应该注意到一个派生函数是虚拟的,但澄清它并没有什么坏处。@Mike是的,我的回答在任何方面与此相矛盾吗?不,只是提供了一点关于背景中发生了什么的详细信息。了解引擎盖下发生的事情往往会让事情变得更清楚。此外,一个小型编译器可以合法地生成对classname::function()的静态调用,该调用恰好与一个虚拟基类共享一个名称。