C++ 解决抽象类的多重继承

C++ 解决抽象类的多重继承,c++,multiple-inheritance,C++,Multiple Inheritance,假设我有4门课: class I { public: virtual void X() = 0; }; class A : public virtual I { public: virtual void X() { } }; class B : public I { }; class C : public A, public B { }; I、B和C是抽象的,而asA不是抽象的。如果我只是将virtual添加到I的B继承中,那么A::X()在C中解析I::X() 但是,我无法更改B的源代码

假设我有4门课:

class I { public: virtual void X() = 0; };
class A : public virtual I { public: virtual void X() { } };
class B : public I {  };
class C : public A, public B { };
I
B
C
是抽象的,而as
A
不是抽象的。如果我只是将
virtual
添加到
I
B
继承中,那么
A::X()
C
中解析
I::X()

但是,我无法更改
B
的源代码

我的问题:我可以让
A::X()
来解析
I::X
C
,而不必更改
B
?我曾尝试将
A
B
声明为
C
的虚拟对象,但均无效。我试图没有多余的代码(例如,让C声明X(){A::X();})。有整洁的黑客吗


还有-有一些问题非常像这样,但我找不到任何关于使用
虚拟继承的讨论。如果我错过了,请给我指一个。

我能想到的唯一方法是将
B*
(或智能变体)组合成
C
,而不是从中继承,然后转发适当的方法。您不能在维护继承时执行此操作,因为编译器不知道遵循哪个
I
的继承链。

您的问题在于vtables。在当前代码中,您有两个代码-一个在
A
I
中,另一个在
B
I
。只要
A
实际上继承
I
,您就可以使用常规继承并节省开销。如果两个虚拟继承的
I
C
中只有一个
I
实例,因此只有一个vtable,
A::X
确实可以覆盖纯虚拟
I::X

如果您不能更改
B
,那么唯一可以同时处理这两个vtable的地方就是
C
。在我看来,要走的路就是你提到的——只要让
C::X
将调用转发到
A::X
。那里没有代码重复,这使得
C
非抽象:

class C : public A, public B {
public:
    virtual void X() { A::X(); }
};
至于虚拟继承,肯定没有。但是欢迎你问…

这很好:

这里的问题是,在C中有两个接口I。这就是为什么A::x()满足 它的接口I-但它不能从类B抽象接口I。
对于C来说,只有一个接口是I——将B更改为从I虚拟派生——这样,来自A和B的I接口都将合并到C中的一个。您不能更改B——因此,唯一的方法是添加您试图避免的冗余代码。我的意思是定义C::X()

有趣的想法(指向“整洁黑客”)我在问题中没有提到,但我需要将C公开为B*,所以这不起作用。但是谢谢你的建议。实际上,你可以通过继承
B
来做到这一点。如果在
C
中实现
X
,它将作为
X
在两个基中的最终重写器。我希望我不必定义C::X,但这似乎是共识。谢谢。我非常感谢你的解释,谢谢。此外,相关问题的“智能”链接也有一些宝贵之处。我会选择PiotrNycz的答案——部分原因是新来的家伙可能需要更多的名声:)——而你们都给出了我需要的答案。再次感谢你。