Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用派生基类替换基类_C++_Inheritance_Virtual - Fatal编程技术网

C++ 如何用派生基类替换基类

C++ 如何用派生基类替换基类,c++,inheritance,virtual,C++,Inheritance,Virtual,我正在开发一个API,其中类a派生为类B 如果API用户希望在应用程序级别扩展a类和B类的功能,那么就会出现问题 假设应用程序用户提出类AX扩展类A,类BX扩展类B。在本例中,用户没有得到类BX的预期行为,因为类Bs的基类是类A而不是类AX 思考:应用程序用户可以使用类B和类AX扩展类BX,但在这种情况下,我认为会有已知的菱形行为 我想知道解决这个问题的标准方法。你的问题有点模糊。不管怎么说,我建议你阅读这本书,尤其是。问题25.5和25.6讨论了一些备选方案 。。。但在这种情况下,我认为会有已

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

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

假设应用程序用户提出类AX扩展类A,类BX扩展类B。在本例中,用户没有得到类BX的预期行为,因为类Bs的基类是类A而不是类AX

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


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

你的问题有点模糊。不管怎么说,我建议你阅读这本书,尤其是。问题25.5和25.6讨论了一些备选方案

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

那有什么问题<代码>虚拟继承是为了解决这种菱形模式。

如果
A
的子级实际上是继承的,那么我看不出有任何问题,除非更改设计。

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

class A;

template<typename WhichA>
class B : public WhichA;

class AX : public A;

class BX : public B<AX>;
A类;
模板
B类:公共卫生;
AX类:公共A类;
BX类:公共B类;
类接口a;
B类;
A类:公共接口A;
模板
B类模板:公共接口B,公共类型;
//以下与示例中的B类相同
//用户可以像使用B类一样使用B
类型定义B_模板B;
//用户可以扩展
AX类:A类;
//用户可以以任何方式扩展B(您不能对此进行监控)
//但你在问题中想要的方式是:
类BX:B_模板;//扩展AX的继承
<>这解决了你的问题,但是正如评论中所指出的,你应该考虑依赖注入而不是继承。< /P>
此外,接口类并不是真正需要的,但它可以明确基类上的契约是什么——即模板参数AType必须满足InterfaceA。

我建议避免继承,而是使用某种依赖注入(A获取A'对象,B获取A和B'对象,外部用户定义A'到AX和B'到BX的映射--问题已解决)我的类B共享类A的大部分实现,因此需要几个方法重写来实现类B中的附加功能。在这种情况下,我们可以避免继承吗?我想忽略模板攻击。
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