一次覆盖两个方法

时间:2014-11-14 15:59:30

标签: c++ c++11 standards standards-compliance

下面的代码在VS 2012中令人惊讶地编译。

方法C :: f()会覆盖两个基类中的方法。

这是标准行为吗?我查看了C ++ 11标准,并未发现任何明确提及此类情况。

class A { virtual void f() = 0; };

class B { virtual void f() = 0; };

class C : public A, public B { 
  virtual void f() override { } 
};

2 个答案:

答案 0 :(得分:7)

是。标准说,在C ++ 11 10.3 / 2

  

如果在类vf和类Base中声明虚拟成员函数Derived,直接或间接从Base派生,则成员函数vf与声明Base::vf的同名[等],然后覆盖 Base::vf

多个基类没有特殊情况,因此在派生类中声明的函数将覆盖所有基类中的合适函数。

答案 1 :(得分:3)

Herb Sutter解释了如何处理这个here

根据文章:

class B1 {
  public:
    virtual int ReadBuf( const char* );
    // ...
};

class B2 {
  public:
    virtual int ReadBuf( const char* );
    // ...
};

class D : public B1, public B2 {
  public:
    int ReadBuf( const char* ); // overrides both B1::ReadBuf and B2::ReadBuf
};
  

这会使用相同的实现覆盖BOTH函数