C++ 虚拟函数能否被非虚拟函数重写?

C++ 虚拟函数能否被非虚拟函数重写?,c++,c++11,overriding,virtual-functions,C++,C++11,Overriding,Virtual Functions,在此代码中: class Base { public: virtual void method() = 0; }; class Derived1 : public Base{ public: virtual void method() override { } }; class Derived2 : public Base{ public: void method() override { } }; Derived1和Derived2之间有什么区别吗?它们是相同的

在此代码中:

class Base {
public:
    virtual void method() = 0;
};

class Derived1 : public Base{
public:
    virtual void method() override { }
};

class Derived2 : public Base{
public:
    void method() override { }
};
Derived1
Derived2
之间有什么区别吗?

它们是相同的

virtual
在实际重写函数时是可选的。仅当在基类中标记函数时,它才是必需的。

来自c++11标准(草案n3337)第10.3节虚拟函数第2点:

如果虚拟成员函数vf在类基类和派生类中声明,则直接或间接派生 从Base开始,是具有相同名称、参数类型列表(8.3.5)、cv限定符和REF限定符的成员函数vf (或不存在相同的情况)声明Base::vf时,那么派生的::vf也是虚拟的(无论它是否是虚拟的) 因此声明)并覆盖Base::vf


因此
Derived2::method
也是
虚拟的
,即使它没有明确声明为虚拟的。

Derived2::method2
是虚拟的。如果语法允许的话。(未选中)那么
derived2->method()
也将是虚拟的(虽然是隐式的)@R.MartinhoFernandes:那么虚拟关键字是隐含的吗?@Alex:对于我来说,在gcc-4.7.2下,是否需要声明没有虚拟关键字的成员?当这种情况发生时,GCC可以发出警告吗?@Eric:有些人认为将派生函数标记为虚拟函数可以作为文档,其他人则认为这是不必要的代码膨胀。实际上,这两种方式都不重要。对于C++11,可以使用override关键字来指示派生类中的函数是虚拟的。@Eric,我使用user1131467来解释。就我个人而言,我更喜欢它作为文档。至于编译器开关发出警告,我不确定。完美的答案。op的混乱可能来自这样一个事实:在较新的语言中,如Java和C#,可以声明一个方法来停止虚拟。