专攻C ++中的两个祖先类

时间:2014-06-27 16:51:14

标签: c++ inheritance

我已经定义了一个由三个类组成的抽象接口:

class rendering_context {...}
class window : public rendering_context {...}
class offscreen : public rendering_context {...}

这允许各种客户端对象忽略它们所处的渲染上下文类型。到目前为止一直很好。

然后我定义了具体的实现:

class sdl::window : public window {...}
class sdl::offscreen : public offscreen {...}

这一切都按预期工作,客户类很高兴不知道它们是否在屏幕/屏幕外/基于SDL。

我的困惑:

我现在拥有特定于SDL的功能,适用于所有渲染上下文,即不只是sdl::windowsdl::offscreen中的一个或另一个。

这表明需要在某处提取sdl::rendering_context类,但如何将其纳入类层次结构?

如果我像这样制作具体的课程:

class sdl::window : public window, public sdl::rendering_context {...}
class sdl::offscreen : public offscreen, public sdl::rendering_context {...}

假设sdl::rendering_context继承自rendering_context,那么我是不是两次隐含地从rendering_context继承了?在这种情况下,rendering_context是一个抽象的基类,没有成员和几个纯虚函数这一事实是否可以呢?

这和钻石问题一样吗?它似乎可能是,但区别在于没有关于调用哪个基类方法的模糊性:它们是纯虚拟的,它肯定是在实践中执行的层次结构底部的具体实现。

[N.B。我的类声明实际上都不像上面那样,这只是为了说明层次结构。当前代码编译和工作,它只是复制了一些功能。]

1 个答案:

答案 0 :(得分:1)

  

假设sdl :: rendering_context继承自rendering_context,那么我是否已经隐式地从rendering_context继承了两次?

如果这是一个问题,您可以考虑virtual inheritance,其中rendering_context共享基类。如果你想这样做:

class window : public virtual rendering_context {...}
class offscreen : public virtual rendering_context {...}