如何用派生基类替换基类

时间:2012-06-07 03:37:45

标签: c++ inheritance virtual

我正在开发一个API,其中A类派生为B类。

如果API用户想要在应用程序级别扩展A类和B类的功能,那么就会出现问题。

假设应用程序用户提出了扩展类A的类AX,扩展了类B的类BX。在这种情况下,用户没有获得类BX的预期行为,因为类B的基类是类A而不是类AX。

思想:应用程序用户可以使用B类和AX类扩展BX类,但在这种情况下,我认为会有已知的钻石行为。

我想知道,解决这个问题的任何标准方法。

4 个答案:

答案 0 :(得分:1)

你的问题有点模糊。无论如何,我建议您特别阅读C++ FAQ 25Question 25.5。问题25.5和25.6讨论了一些替代方案。

答案 1 :(得分:1)

从模板参数继承的类也是一个选项。伪代码:

class A;

template<typename WhichA>
class B : public WhichA;

class AX : public A;

class BX : public B<AX>;

答案 2 :(得分:0)

  

...但在这种情况下,我认为会有已知的钻石行为

那么问题是什么? virtual遗产是为了解决这种钻石图案 如果A的孩子实际上是遗传的,那么我没有看到任何问题,除非设计被更改。

答案 3 :(得分:0)

class InterfaceA;

class InterfaceB;

class A : public InterfaceA;

template<class AType>
class B_Template : public InterfaceB, public AType;

// Below is same as class B in example
// Users can use B as if it was class B
typedef B_Template<A> B;   

// User can extend A
class AX : A;

// User can extend B any way they want (you can't police this)
// but the way you wanted in the question was:
class BX : B_Template<AX>;   // Inherits of the extended AX

这解决了你的问题,但正如评论中所指出的,你应该考虑依赖注入而不是继承。

此外,实际上并不需要接口类,但它可以清楚地说明基类上的合同是什么 - 即模板参数AType必须满足InterfaceA