【问题标题】:Can a virtual function be overridden by a non-virtual function?虚函数可以被非虚函数覆盖吗?
【发布时间】:2013-06-26 10:02:03
【问题描述】:

在这段代码中:

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

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

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

Derived1Derived2 有什么区别吗?

【问题讨论】:

  • Derived2::method2 是虚拟的。
  • 如果语法允许的话。 (未选中)然后derived2->method() 也将是虚拟的(虽然是隐式的)
  • @R.MartinhoFernandes:所以隐含了 virtual 关键字?
  • @Alex: Compiles fine 我在 gcc-4.7.2 下

标签: c++ c++11 overriding virtual-functions


【解决方案1】:

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

如果在Base类和Derived类中声明了虚成员函数vf,则直接或间接派生 来自 Base,具有相同名称、参数类型列表 (8.3.5)、cv-qualification 和 refqualifier 的成员函数 vf (或不存在相同)作为 Base::vf 被声明,然后 Derived::vf 也是虚拟的(无论它是否是 如此声明),它会覆盖 Base::vf。

所以Derived2::method 也是virtual,即使它没有明确声明。

【讨论】:

  • 是否需要声明没有 virtual 关键字的成员?发生这种情况时可以让 GCC 发出警告吗?
  • @Eric:有些人认为将派生函数标记为虚拟可用作文档,其他人则认为这是不必要的代码膨胀。在实践中,这两种方式都无关紧要。
  • 使用 C++11 可以使用 override 关键字来指示派生类中的函数是虚拟的。
  • @Eric,我同意 user1131467 的说法。就个人而言,我更喜欢将它用于文档。至于编译器开关是否会发出警告,我不确定。
  • 完美答案。操作的混乱可能来自于这样一个事实,即在 Java 和 C# 等较新的语言中,可以声明一个方法来停止虚拟化。
【解决方案2】:

它们是相同的。

virtual 在实际覆盖函数时是可选的。只有在基类中标记函数时才强制使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2016-02-05
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2013-10-04
    • 2011-07-28
    相关资源
    最近更新 更多