下面的代码在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 { }
};
答案 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函数