C++ C++;:重写类继承?
我使用的库中有两个类,让我们称它们为C++ C++;:重写类继承?,c++,class,inheritance,C++,Class,Inheritance,我使用的库中有两个类,让我们称它们为class a和class B,以保持通用性类别B继承自类别A,因此类似于: class A{ ... } class B: public A{ ... } 所以没什么特别的,但是我不能直接编辑这两个类。现在我想向类A添加一些功能,所以我将其子类化为,比如,myClassA,并在子类中添加功能。这在我使用myClassA时非常有效,但当然,我使用classB的任何地方仍然继承了原始classa,而不是myClassA 如何创建继承自myCl
class a
和class B
,以保持通用性<代码>类别B继承自类别A
,因此类似于:
class A{
...
}
class B: public A{
...
}
所以没什么特别的,但是我不能直接编辑这两个类。现在我想向类A添加一些功能,所以我将其子类化为,比如,myClassA
,并在子类中添加功能。这在我使用myClassA
时非常有效,但当然,我使用classB
的任何地方仍然继承了原始classa
,而不是myClassA
如何创建继承自myClassA
的classb
子类,而不是原始classA
?即使类B
已经从原始的类A
继承,但让子类同时从类B
和myClassA
继承是否可行
编辑:我刚刚尝试了“从两者继承”选项,可以确认它不起作用,至少在没有更多工作的情况下不起作用。可能是评论中提到的钻石问题。因此,除非有办法用myClassA
覆盖classb
对classa
的继承,否则我可能不得不在classb
的子类中重新实现我对classa
的子类所做的更改,尽管这违反了DRY原则
编辑2:为了使它更具体一些,以标准的“shape”类为例。因此,在本例中,您将有一个基类,例如,rectangle
,并且rectangle
被一个square
类继承。现在我想添加一些功能,比如说一个“移动”功能,它将对象的位置移动指定的量。这对于rectangle
和square
都是一样的,因此理想情况下我会在rectangle
类中实现它,而square
将继承它。但是,由于我不能直接访问矩形
或正方形
类,因此我只能使用子类。因此,我希望创建一个square
子类,该子类继承自我的rectangle
子类,而不是基rectangle
类
编辑3:用更具体的例子来重申和澄清这个问题,“我可以/如何创建square
的子类,但让它继承自my_rectange
(一个rectangle
子类),而不是继承自rectangle
?”或者,换句话说,“如果不能直接修改基类,我可以/如何用自己的东西替换基类?”模板类myclsssA:t{/*…*/}
新myclassA()
有时,这取决于你在做什么。这能做什么或不能做什么都非常精确,问题中没有足够的细节来接近了解
这使得myclassA成为最具派生性的形式,因此它可以成功覆盖所有虚拟方法。但如果你不创建B的实例,它将毫无帮助。听起来你可能会遇到@scohe001的可能副本。我将不得不进一步研究它,看看这是否会是一个问题。我想最坏的情况是,我只需类B,并重新实现我在类A的子类中添加的东西。问题是是否有一种方法可以“覆盖”继承-比如用我的类A替换你的类A祖先,这将避免任何此类问题。XY问题?为什么要向不应该添加功能的类添加功能(我想,它们在一个库中)?听起来你需要合成而不是继承。请参阅我的edit2以获得更具体的示例。这种情况下有效吗?如果有效,如何?@ibrewster:请注意,只有在你控制创建B(或在本例中为square)的情况下,这才起作用是的,我完全控制了类的实例化,只是定义没有控制
模板没有编译…你的意思是=
?@HolyBlackCat:在找到语法又两次失败后,我去掉了类型过滤器。
template<class T /* T must be derived from A */> class myclsssA:T { /* ... */ }
new myclassA<B>()