通过继承实现接口

时间:2011-02-25 03:29:52

标签: c++ inheritance

我有一个公共接口,我的项目中的许多类都继承(FWIW它是一个引用计数接口)。此接口由类和其他接口继承。我不想在每个类中重新实现接口,而是希望只有一个相应的实现类,所有其他类都继承。问题在于我的布局导致了死亡之钻。

struct IBar {
    virtual VOID Bar() = 0;
};

struct CBar : IBar { // implementation class for IBar
    VOID Bar() { }
};

struct IFooBar : IBar {
    virtual VOID Foo() = 0;
};

struct CFooBar : IFooBar, CBar { // implementation of IFooBar interface
    VOID Foo() { }
    // Bar() should be implemented by the inheritance of CBar
};

如果我尝试编译,我会收到以下错误:

error C2259: 'CFooBar' : cannot instantiate abstract class
1>          due to following members:
1>          'void IBar::Bar(void)' : is abstract

我意识到我可以通过实施CFooBar::Bar() { return CBar::Bar(); }IFooBar继承CBar来解决此问题,但我怀疑解决这个问题的方法不那么简单。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

您可以尝试从IBar始终virtually inheriting。这样一来,你就可以说是中间人了,而且无论你是否继承了它的一个后代,你总是直接继承它。

例如:

class IBar {
    public:
    virtual void Bar() = 0;
};

class CBar : public virtual IBar { // implementation class for IBar
    public:
    void Bar() { printf("bar\n");}
};

class IFooBar : public virtual IBar {
    public:
    virtual void Foo() = 0;
};

class CFooBar : public IFooBar, public CBar { // implementation of IFooBar interface
    public:
    void Foo() { }
    // Bar() should be implemented by the inheritance of CBar
};

int main(int argc, char *argv[])
{
    CFooBar cfb;

    cfb.Bar( );

    system("PAUSE");
    return EXIT_SUCCESS;
}

如果您正在编写任何成员函数,我总是建议使用class而不是struct - 毕竟,这样的事情就是定义一个类。此外,值得在我的示例中明确设置访问修饰符(上面的代码实际上没有添加它们就编译)。

答案 1 :(得分:0)

您是否尝试过using CBar::Bar;声明?