在C ++类之间共享实现

时间:2015-06-29 14:08:39

标签: c++ multiple-inheritance

我希望能够在同一基类的某些类(但不是所有类)之间共享实现。为了概念的正确性,我想使用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,我要使用的3个类派生自ABCD

CD共享通用实现,我已将其作为I在单独的类DoIStuff()中实现。由于此实现需要执行基类A中定义的内容,I也会继承A。虚拟关键字在那里,因为我在创建AC时只需要D的一个实例。

这一切对我来说都很美观,但是当我尝试编译它时(使用VS 2008的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'

要使用多重继承,请添加&#34;占位符&#34;类(例如J)继承A(但不做任何其他事情)并从此类继承DC而不是直接从{{1似乎工作。但是,这个占位符类使得代码的表达能力降低,并且难以理解。

或者,我可以A获取DoIStuff参数,这意味着A不必从I继承。但是,这意味着我必须在ADoIStuff中重载D

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

1 个答案:

答案 0 :(得分:3)

你需要

1. class D : public virtual A, public I

2. class C : public virtual A, public I

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

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