Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++;:重写类继承?_C++_Class_Inheritance - Fatal编程技术网

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>()