我可以有多个基类吗?

Posted

技术标签:

【中文标题】我可以有多个基类吗?【英文标题】:Can I have more than one base class? 【发布时间】:2020-08-13 15:41:44 【问题描述】:

我的代码中可以有多个基类吗?

我想编写一个多项式、序列、对数计算器(我以后可能会添加一些东西)

所以我想做:

class algebraicExpression  //should it be algebraicExpression or arithmeticExpression

    virtual void gather()=0; 
    virtual void show()=0;

polynomialWxpolynomialPxsequenceAnsequenceBnsequenceCn 等类将继承自 algebraicExpression 这两个函数。问题是我应该将addition()subtraction()multiplication()division() 等函数放到algebraicExpression 类中还是创建:

class operation

然后把它放在那里,我知道序列不会使用这些,但 polynomialslogarithms 可以,也许我稍后会添加一些新的东西也会使用它。

还有例如:polynomialPx 是否可以继承自基类虚函数和 polynomialWx 属性,例如 int degreefloat coefficients 等。

因为有人告诉我类似钻石问题,但我不知道它是否相关。

【问题讨论】:

在互联网上搜索“C++ 多重继承”。 您可能希望有中间基类:binary_operationunary_operation。一个代数表达式包含一个或多个二元运算和一个或多个一元运算(它实际上可以有零的一种类型,但必须至少有一个运算)。二元运算有一个运算符和两个操作数。一元运算包含一个操作数和一个运算符。 可以,但是如果你继承的类已经相关或者有冲突的成员标识符,就会变得复杂。 【参考方案1】:

如果所有计算器类都继承自同一个基类,我只会将所有计算器使用的函数放在基类中。 algebraicExpression 类是抽象的,因为您使其中的所有函数都成为纯虚拟的。这很好,因为您不想将该类用作独立类而仅将其用作基础。缺点是,您必须覆盖所有纯虚函数。在你的情况下这很糟糕,因为你不希望所有的函数都包含在所有的计算器中。 您可以使用一个名为操作的类来解决此问题,并且仅在需要时才继承。但问题是,操作类的功能只能使用操作类的成员。这意味着如果您在计算器类中使用操作类的方法,您必须为计算器类编写一个成员函数,然后调用操作符类的函数。 这些操作(加法、除法……)并不复杂。我认为你有点过度设计你的任务。我只会编写函数并在计算器类中使用它们,我认为不需要操作类。 钻石问题在本站讲解:https://www.geeksforgeeks.org/multiple-inheritance-in-c/

如果您保持代码简单,那么您的示例中就不会发生这种情况。 请注意,我不聪明,这个答案可能完全是垃圾。如果你有更好的想法,不要照我说的去做,尝试你自己的想法。

【讨论】:

以上是关于我可以有多个基类吗?的主要内容,如果未能解决你的问题,请参考以下文章

Ue4类设置找不到基类

我可以在 ASP.NET MVC3 中将自定义类设置为我的控制器的默认基类吗?

一个类可以在其成员初始化列表中初始化其非立即基类吗?

qt5.5里面有消息队列的类吗

知道基类指针指向哪个派生类

关于C++基类、派生类的引用和指针