我有一个公共接口,我的项目中的许多类都继承(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
来解决此问题,但我怀疑解决这个问题的方法不那么简单。任何建议都将不胜感激。
答案 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;
声明?