C++ 使用相同的纯虚方法从不同抽象基进行多重继承

Scr*_*tch 5 c++

想象

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

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

class C : public A,B
{
  public: virtual void f()
  { // implementation here
  }
};

C c();
Run Code Online (Sandbox Code Playgroud)

这似乎可以编译。(没有尝试编译我的示例,而是更复杂的现实生活场景)。

我有点惊讶它实际上可以编译。我本来会抱怨(在 C 的实例化时),因为我只实现了一种抽象基本方法。(尽管他们有相同的名字。)

这是否像我期望的那样工作(假设函数 f 在两个基数中具有相同的含义)或者是否有任何陷阱?

Mar*_* A. 2

令人烦恼的解析再次出现(你打开编译器警告了吗?):

C c();
Run Code Online (Sandbox Code Playgroud)

是一个函数声明,因此没有构造对象。c无论如何,如果你声明为,就不会有任何歧义

C c;
Run Code Online (Sandbox Code Playgroud)

因为两个纯虚函数将被最派生的C::f().

如果你要写类似的东西,就会产生歧义

class A
{
  public: void f() {}
};

class B
{
  public: void f() {}
};

class C : public A,B
{
public: 


};

int main() {

    C c;
    c.f(); // Need to call a base one, but which one?

}
Run Code Online (Sandbox Code Playgroud)

错误:在不同类型的多个基类中找到成员“f”