C++ 用多重继承实现纯虚函数

C++ 用多重继承实现纯虚函数,c++,inheritance,multiple-inheritance,pure-virtual,C++,Inheritance,Multiple Inheritance,Pure Virtual,假设存在此接口: class A{ public: virtual foo()=0; }; class B:public A{ public: virtual foo(){} //Foo implemented by B } 以及实现此接口的类B: class A{ public: virtual foo()=0; }; class B:public A{ public: virtual foo(){} //

假设存在此接口:

class A{  
 public:  
  virtual foo()=0;  
};
class B:public A{    
 public:   
  virtual foo(){} //Foo implemented by B   
}
以及实现此接口的类
B

class A{  
 public:  
  virtual foo()=0;  
};
class B:public A{    
 public:   
  virtual foo(){} //Foo implemented by B   
}
最后,一个类
C
,它将类
a
B
作为基类:

Class C : public A, public B {
};

我的问题是,有一种方法可以告诉编译器,
foo
的实现是类
B
中的实现,而无需显式调用
B::foo()

,因为您的示例中有两个基类(这可能是设计问题/设计气味,我要回顾一下)您必须显式地调用您所追求的实现,无论是
A::foo()
还是
B:foo()


如果所有的B都是为了提供<代码>()(代码)>的实现,我会考虑将实现移动到A(您可以提供一个纯虚拟函数的实现),但是即使在这种情况下,您也必须通过它的限定名调用它。

只使用虚拟继承,因此,
B
提供的
A
子对象与
C
中使用的对象相同

或者写C类:公共B类。。。无论如何,它都可以通过基类
B
作为
A
隐式使用


在编辑问题之前:

B::foo
A::foo
不兼容

所需签名为

ReturnType /* missing from question */ foo(A* const this /* this parameter is implicit */);
但是
B::foo
有签名

ReturnType foo(B* const this);

将传递给虚拟函数的
A*
不是实现所需的
B*
。如果
B
继承自
A
,则编译器将生成
B::foo
以接受
A*const子对象
,并从该子对象指针中找到
B*const this
对象。但是
B::foo
不知道
C

中的关系,正如@BenVoigt在评论中指出的那样,下面的答案只适用于g++中的一个bug(这意味着它不能保证继续工作,而且肯定不能移植)。因此,尽管如果您使用一个特定的(有缺陷的)编译器,它可以做您想要做的事情,但它不是您应该使用的选项

不过一定要用


这并不是问题中的代码所暗示的场景,而是句子

我的问题是,有一种方法可以告诉编译器 foo的实现是来自类B的实现,没有执行 显式调用B::foo()

似乎要求语法来区分函数的多个基本版本,而不使用
限定符

您可以使用指令
执行此操作:

#include <iostream>
class A {
public:
A(){}
virtual void foo(){std::cout<<"A func";}
};

class B: virtual public A {
  public:
  B(){}
  virtual void foo(){std::cout<<"B func";}
};
class C:virtual public A, virtual public B {
    public:
    C(){}
    using A::foo; // tells the compiler which version to use
                   // could also say using B::foo, though this is unnecessary
};

int main() {
    C c;
    c.foo(); // prints "A func"
    return 0;
}
#包括
甲级{
公众:
A(){}

虚拟void foo(){std::coutWhy您想用另一种方式来实现它?唯一可以避免的是代码中的混乱。我不想对从接口派生的所有纯虚拟函数进行包装。相反,我想使用具体类的实现。有一种方法可以在没有这些包装的情况下实现,或者我必须在包装上实现对于从具体类调用实现的每个函数,pper?现在,
B
没有实现该接口。您是否打算
B类:公共A
?是的,我打算。我编辑了问题=)谢谢您您接受的答案是不可移植的代码,它只在g++中工作,而且只是因为编译器错误。您可以我不想重新思考这个问题。没有虚拟继承,这是不行的,虚拟继承也不需要。顺便说一句,这是一个g++错误。它应该打印“B func”根据标准。@BenVoigt Hah,谢谢你指出这一点。我在那里学到了一些东西。我已经+1了你的答案,所以我不能再这样做了……我将在一点时间内删除这个答案,以清理数据库,希望避免让未来的搜索者感到困惑。解释一下使用
声明是多么诱人,一个并且它不会按照标准工作,而不是删除。@BenVoigt完成。如果您觉得有必要进一步澄清,请随意编辑此答案的任何部分。