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#,可以声明一个方法来停止虚拟。