多继承-C++类之间的共享实现

multiple inheritance - Sharing implementation between C++ classes

本文关键字:共享 实现 之间 继承 -C++      更新时间:2023-10-16

我希望能够在同一基类的某些类(而不是所有类)之间共享实现。为了概念的正确性,我想使用C++的多重继承功能来实现这一点(我知道一个解决方案可能是使用组合)。

class A
{
public:
    A()
    {
        cout << "Constructed A" << endl;
    }
    void DoAStuff()
    {
        cout << "Did A stuff" << endl;
    }
};
class I : public virtual A
{
public:
    I()
    {
        cout << "Constructed I" << endl;
    }
    void DoIStuff()
    {
        DoAStuff();
        cout << "Did I stuff" << endl;
    }
};
class B : public A
{
public:
    B()
    {
        cout << "Constructed B" << endl;
    }
    void DoBStuff()
    {
        cout << "Did B stuff" << endl;
    }
};
class C : public A, public I
{
public:
    C()
    {
        cout << "Constructed C" << endl;
    }
    void DoCStuff()
    {
        cout << "Did C stuff" << endl;
    }
};
class D : public A, public I
{
public:
    D()
    {
        cout << "Constructed D" << endl;
    }
    void DoDStuff()
    {
        cout << "Did D stuff" << endl;
    }
};
int main()
{
    cout << "Creating a B" << endl;
    B *b = new B();
    cout << "Creating a C" << endl;
    C *c = new C();
    c->DoIStuff();
    cin.ignore();
    return 0;
}

在本例中,我有blase类A,以及从A派生的3个类:BCD

CD都有共同的实现,我在单独的类I中实现了DoIStuff()。由于这个实现需要做基类A中定义的东西,所以I也继承了A。虚拟关键字是存在的,因为在创建CD时,我只想要A的一个实例。

这一切对我来说似乎很美好,很有表现力,但当我试图编译它时(使用VS2008的VC++编译器),我得到了以下2个错误:

error C2584: 'C' : direct base 'A' is inaccessible; already a base of 'I'
error C2584: 'D' : direct base 'A' is inaccessible; already a base of 'I'

为了在多重继承的情况下实现这一点,添加一个继承A(但不做任何其他事情)的"占位符"类(例如J),并从该类继承DC,而不是直接从A继承似乎是可行的。然而,这个占位符类会降低代码的表达能力,并使其难以理解。

或者,我可以让DoIStuff取一个A参数,这意味着I不必从A继承。然而,这意味着我必须在DC中过载DoIStuff

有人知道在这种情况下共享实现的最佳解决方案是什么吗?

您需要

1. class D : public virtual A, public I
2. class C : public virtual A, public I

否则,无法正确设置多重继承的菱形。

也要阅读一下奇怪的重复出现的模板模式。这可能是一个可行的替代方案。