C++ 继承仅用于代码重用c++;

C++ 继承仅用于代码重用c++;,c++,oop,inheritance,multiple-inheritance,C++,Oop,Inheritance,Multiple Inheritance,我有A类和B类。现在我需要编写一个新的C类,它将在A类和B类中使用一些字段和方法,但不是全部。(我将使用A和B中大约50%的材料) 现在我正在考虑从A和B继承,但这将使C包含许多没有意义的字段和方法 基本上,我只是出于代码重用的目的使用继承,因为否则我将不得不复制和粘贴A和B中的许多代码行 这种做法真的很糟糕吗?有不同的方法吗 谢谢 这很糟糕。仅当继承在逻辑上有意义时才使用它 改用作文(private继承是作文的一种形式,但最好还是老一套): 如果C不是由A和B组成,您也可以保留指针,这样C的大

我有A类和B类。现在我需要编写一个新的C类,它将在A类和B类中使用一些字段和方法,但不是全部。(我将使用A和B中大约50%的材料)

现在我正在考虑从A和B继承,但这将使C包含许多没有意义的字段和方法

基本上,我只是出于代码重用的目的使用继承,因为否则我将不得不复制和粘贴A和B中的许多代码行

这种做法真的很糟糕吗?有不同的方法吗


谢谢

这很糟糕。仅当继承在逻辑上有意义时才使用它

改用作文(
private
继承是作文的一种形式,但最好还是老一套):


如果
C
不是由
A
B
组成,您也可以保留指针,这样
C
的大小就不会增加。

继承应该使用“is A”范例。
这意味着C应该继承A,B,如果它是A和B的一种。
如果您已经在使用多重继承,您可能希望将A和B分解为多个类,每个类都处理代码的一小部分,然后只从您需要的部分继承C—这样C只会占用它所需的空间(假设A和B有许多成员)。

请记住,类的大小不受成员方法的影响,只受成员数据的影响。

继承没有“是a的一半”的概念,因此这里绝对不是这样。这听起来像是写作的最佳案例

听起来好像
A
B
有不止一个“功能”,因为它们中的一半都足以组成
C

<> p>我不确定这是适用于您的情况,但考虑将A分成两部分,<代码> A1 < /C>和<代码> A2 < /C> >在>A1中<代码> C <代码>所需的功能。然后对
B
B1
B2
执行相同的操作


A
将是
A1
A2
的组合,
B
将是
B1
B2
的组合,
C
将是
A1
B1
的组合。没有任何非必要的功能或数据。

< P>正如萨特和Andrei Alexandrescu在他们的书中解释的,继承是C++允许在两个类之间使用的最紧密的关系之一,它只是第二个类之间的< <代码>朋友> /代码>关系。

根据,一个成功的设计应该以类之间的松散耦合为目标——这意味着将依赖关系保持在最小程度;这反过来又意味着继承是一种应该谨慎使用的工具

当然,依赖关系通常需要存在于某个地方,因此可以从根本没有实现的类继承一个合理的折衷方案(类似于C#和Java等语言中所谓的
接口
s)。e、 g

使用这种方法,如果您的代码元素在几个可驱动类之间重用,您通常会使用组合或其他较弱的关系来消除重复的代码。
e、 g.可能您想对
公共汽车
汽车
重复使用
左转
的代码,而不是
火车
,因为左转是不符合逻辑的,所以
左转
可能会在属于
公共汽车
汽车
的单独类别中结束

  • 此外,任何可能需要了解所有模糊相关类的功能都将位于类继承权之外,只知道接口/基础,而不知道具体的实现细节
最终的结果可能是少量额外的合成代码,但通常是不太复杂的设计,并且通常是更易于管理的设计。设计这样的代码没有任何硬性规定,因为它完全取决于您试图解决的独特问题

也有其他方法可以在不紧密耦合的情况下重用代码-模板允许您隐式定义接口,而不需要包含纯
虚拟
函数的空类(模板提供额外的类型安全性-这是一件非常好的事情,但它们在语法上稍微复杂一些)


还有一些方法可以使用
std::function
和lambdas以更具功能性的方式重用代码——同样,在传递函数对象时通常不涉及紧密的依赖关系。

听起来重构代码可能会让您受益匪浅:

与此相反:

class A
{
  virtual void foo();
  virtual void bar();
};

class B
{
  virtual void biz();
  virtual void baz();
};

class C : public A, public B
{
  virtual void foo() { /* my stuff */ }
  virtual void biz() { /* my other stuff */ +

  // but I don't need bar or baz!
};
考虑将A和B的概念上不同的部分拆分为C:

class core_A
{
  virtual void foo();
};

class A : public core_A
{
  virtual void bar();
};

class core_B
{
  virtual void biz();
};

class B : public core_B
{
  virtual void baz();
};

class C : public core_A, public core_B
{
  virtual void foo() { /* my stuff */ }
  virtual void biz() { /* my other stuff */ +

  // Great, I don't have bar or baz!
};

在C++中,公共继承是指“IS-A”。其他级别的继承意味着一些不同的东西…比如“是根据”.@cHao实现的-这是真的,但即使使用私有继承-C访问它不需要的部分代码也是一种不好的做法。此外,如果A和B有很多数据成员,C的大小仍然会比它应该的大。谢谢大家的回复!我真的很感激他们。我之所以考虑使用继承而不是组合,是因为我还需要修改A和B中的一些行为。而且我真的不想编辑A和B。
class A
{
  virtual void foo();
  virtual void bar();
};

class B
{
  virtual void biz();
  virtual void baz();
};

class C : public A, public B
{
  virtual void foo() { /* my stuff */ }
  virtual void biz() { /* my other stuff */ +

  // but I don't need bar or baz!
};
class core_A
{
  virtual void foo();
};

class A : public core_A
{
  virtual void bar();
};

class core_B
{
  virtual void biz();
};

class B : public core_B
{
  virtual void baz();
};

class C : public core_A, public core_B
{
  virtual void foo() { /* my stuff */ }
  virtual void biz() { /* my other stuff */ +

  // Great, I don't have bar or baz!
};