【问题标题】:virtual qualifier in derived class派生类中的虚拟限定符
【发布时间】:2011-10-29 05:01:23
【问题描述】:

基类的虚函数的virtual限定符在派生类中有什么区别吗?

class b
{
   public:
   virtual void foo(){}
};

class d : public b
{
  public:
  void foo(){ .... }
};

class d : public b
{
  public:
  virtual void foo(){ .... }
}; 

这两个声明有什么不同吗,除了它使 d 的孩子意识到 foo() 的虚拟性?

【问题讨论】:

  • afaik,如果其他东西从类 d 派生出来,那会有所不同
  • @Kshitij:不,即使那样也没有任何区别。一旦foo 是虚拟的,它就永远是虚拟的,无论您离类层次结构中的基础有多远。

标签: c++


【解决方案1】:

没有区别。 foo 在所有从 b 派生的类(及其后代)中都是虚拟的。

来自 C++03 标准,§10.3.2:

如果在Base类和Derived类中声明了一个虚成员函数vf,直接或间接从Base派生,则声明一个与Base::vf同名同参数列表的成员函数vf,则Derived ::vf 也是虚拟的(无论是否如此声明),它会覆盖 Base::vf。

【讨论】:

    【解决方案2】:

    没有区别 - 无论哪种方式,它都是虚拟覆盖。

    这是风格问题,已经明确讨论过here

    【讨论】:

      【解决方案3】:

      最好包含 virtual 关键字。但这不是必需的。

      【讨论】:

        【解决方案4】:

        没有区别。

        一旦foovirtual,它的 virtual 将永远在类层次结构中,无论你离类层次结构中的基础有多远。 p>

        但我更喜欢写virtual,即使在被覆盖的函数中,因为它增加了代码的可读性,这很重要。

        【讨论】:

        • 为了额外的安全性,C++11 添加了一些你可以指定的 override 关键字,所以编译器会检查你在覆盖一个虚函数时,你没有在签名中犯错误并意外重载它
        猜你喜欢
        • 2017-11-15
        • 2011-01-15
        • 2020-10-26
        • 2019-11-04
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 2013-10-07
        相关资源
        最近更新 更多