我是不是将基类与超类一起继承以进行多重继承?

     2023-02-23     238

关键词:

【中文标题】我是不是将基类与超类一起继承以进行多重继承?【英文标题】:Am I inherting base class along with superclass for multiple inheritance?我是否将基类与超类一起继承以进行多重继承? 【发布时间】:2014-08-02 02:54:49 【问题描述】:

因此,我试图围绕 C++ 中的多重继承这一想法展开思考。在过去的几个小时里,我一直在做一些家庭作业,但遇到了障碍,这与MI 有关。所以我有一个东西继承自的Package 类。 Letter Box Crate Crate 可以选择 MetalCrateWoodCrate 我的问题是:What is needed inside of the Crate class?

crate.h

#ifndef CRATE_H
#define CRATE_H

#include "package.h"

class Crate: public Package
public:
  Crate();
  Crate(double price, int weight, int trackingNumber);

  double cost();
;

#endif

成本是包中的一个虚函数,所有类都有自己的实现。 I shouldn't have to define all the public variables that I defined inside of Package inside the Crate class 对吗?我一直在网上阅读资料,但似乎无法理解 Crate 类中需要什么。

Package.h

class Package

protected:
  double price;
  int weight;
  int trackingNumber;

public:
  Package();
  Package(double price, int weight, int trackingNumber);

  void setWeight(int weight);
  void setPrice(int price);
  void setTrack(int track);
  double getPrice();
  int getWeight();
  int getTrack();

  virtual double cost() = 0;
  ~Package();
;

MetalCrate.h

class MetalCrate: public Crate, public Package
public:
  MetalCrate();
  MetalCrate(double price, int weight, int trackingNumber);

  double cost();
;

这就是我的课程的样子。请帮忙,提前谢谢。

metalcrate.h:16:7: warning: direct base ‘Package’ inaccessible in ‘MetalCrate’ due to ambiguity [enabled by default] class MetalCrate: public Crate, public virtual Package this is the error i get when i try to compile. i'm trying to get my wood/metal crate to inherit from crate and package –

讨论转移到了一个更详细地解释事情的聊天

【问题讨论】:

使用 C++ 多重继承的最好方法是完全避免它 另外,你能把你的问题说得更清楚一点吗?我很乐意回答,但我不确定你到底在问什么。 多重继承在哪里? Crate 只有一个父类。 @Pradhan 哎呀我忘了添加我的金属箱类。实际上我什至不确定如何正确设置金属板条箱类 让我们continue this discussion in chat. 【参考方案1】:

有不同的方式来构建代码,但就面向对象的设计而言,通常最好不要在基类中包含任何状态或实现,而只在最终的具体类中包含状态和实现。一个原因是,经常会遇到这样一种情况,即实现与基类所考虑的实现集大不相同,因此基类使用的存储变得不适合特定实现。另一个原因是,在基类中提供实现可能会对实现施加额外的不变量和约束,而这些实现可能不知道或很容易被破坏。

简而言之,一种更好的结构方式是:

class Package 
  public:
    virtual ~Package();
    virtual double getPrice() const = 0;
    virtual int getWeight() const = 0;
    virtual int getTrack() const = 0;
    virtual double cost() const = 0;

  protected:
    Package();
;

然后,创建一个单独的类,封装公共元素(或创建一个“AbstractPackage”,其他包实例可以选择继承)。这使您可以创建一个 Package 的实现,如果它不适用于某些替代实现,它不会携带默认实现/变量的额外包袱。此外,即使对于您的“AbstractPackage”,您也不应该将变量设置为“protected”或“public”;所有成员变量都应该是“私有的”(如果您的派生类需要访问,请考虑使用“受保护”访问器)。

【讨论】:

那么我应该使用子类中的设置器,比如字母或框来设置重量和价格等吗? 那或使用“AbstractPackage”的基本构造函数。您还应该考虑在构造后这些值是否需要可变;在可能的情况下,在构造时提供此类配置通常会更好/更干净,然后在成功创建对象后使状态不可变,尽管这实际上取决于有关您的使用/应用程序的更多细节。

我们可以将基类的私有成员继承到派生类的公共成员中吗?

】我们可以将基类的私有成员继承到派生类的公共成员中吗?【英文标题】:CanweinheritprivatemembersofaBaseclassintopublicmembersofaDerivedclass?【发布时间】:2021-11-1512:33:12【问题描述】:问题是我需要将基类的私有成员转换为派生类公共... 查看详情

如何在多重继承中调用超类方法?

】如何在多重继承中调用超类方法?【英文标题】:Howtocallsuperclassmethodinmultiple-inheritance?【发布时间】:2020-10-2715:24:00【问题描述】:我有一个类C,它继承自Ai和B。A和B不相关。下面的代码可以很好地解释这一切。在main()中,我... 查看详情

将基类传递给函数而不是派生一个

】将基类传递给函数而不是派生一个【英文标题】:Passingbaseclasstofunctioninsteadderivedone【发布时间】:2020-08-1310:16:52【问题描述】:我的继承有问题,这是我的示例代码:#include<iostream>structDrawablefriendvoiddraw(constDrawable&drawab... 查看详情

重构以避免在使用抽象类而不是接口时进行多重继承(代码片段)

...得相当复杂。在许多情况下,我试图在可能的情况下避免继承;例如,我更喜欢“has-a”设计而不是“is-a”设计。我相信我的设计会遇到指示最终设计将是多重继承的情况。我知道多重继承的禁忌,而Java和C#都不允许这样做。我... 查看详情

多重继承

...-1>3.4.5.6<statement-N>#可以看到,多重继承就是有多个基类(父类或超类)。#需要注意圆括号中父类的顺序,若父类中有相同的方法名,在子类使用时未指定,Python会从左到右搜索。若 查看详情

抽象基类、私有继承和多重公有继承

】抽象基类、私有继承和多重公有继承【英文标题】:AbstractBaseClass,privateinheritanceandmultiplepublicinheritance【发布时间】:2015-05-1911:37:43【问题描述】:我有问题或误解。这里我有一些ABC(Person)还有两个私有派生的虚拟类(PokerPla... 查看详情

Python 多重继承:选择要调用的基类方法

】Python多重继承:选择要调用的基类方法【英文标题】:Pythonmultipleinheritance:pickingwhichbaseclass\'methodtocall【发布时间】:2014-07-1500:32:08【问题描述】:我定义了一个类C,它继承自A。现在有一个新类B,它提供与A相同的方法,但行... 查看详情

将元类与多重继承结合使用的 TypeErrors

】将元类与多重继承结合使用的TypeErrors【英文标题】:TypeErrorsusingmetaclassesinconjunctionwithmultipleinheritance【发布时间】:2011-01-1307:42:18【问题描述】:我有两个关于元类和多重继承的问题。第一个是:为什么我会得到类Derived的TypeE... 查看详情

大型程序的工具——多重继承与虚继承(代码片段)

...承1、多重继承  在派生类的派生列表中可以包含多个基类,每个基类包含一个可选的访问说明符。  多重继承的派生列表也只能包含已经定义过的类,而且这些类不能是final的。对于派生类能够继承的基类个数,C++没有进行... 查看详情

类与继承

...,新建的类称之为子类,派生类,被继承的类叫做父类,基类或者超类。继承的特性有:在python中一个子类可以继承多个类,在python中分为新式类,经典类,在python3中一个类即便是没有显示继承任何类,他也会默认继承object在... 查看详情

oo面向对象———扩展类与被扩展类

扩展类与被扩展类超类:被扩展类、基类、父类。被final修饰的类不可以做超类。子类:扩展类、子类。为了描述自己的独特性为,要重写超类的方法。如果不重写就默认继承了父类的方法。方法重载:同一个类中有多个名称相... 查看详情

将基类向量传递给接受超类向量的函数

】将基类向量传递给接受超类向量的函数【英文标题】:Passavectorofbaseclasstoafunctionwhichtakesvectorofsuperclass【发布时间】:2017-11-0809:31:42【问题描述】:在我的代码中,我有一个SuperType,它有两个子类型......现在我有一个std::vector&am... 查看详情

理解虚基类多重继承的问题(代码片段)

虚基类和多重继承什么是多重继承多重继承的优点关于菱形继承的问题其他多重继承的情况如何解决多重继承的问题什么是虚基类虚基类如何解决问题查看虚基类的内存布局对比普通继承下的内存布局什么是多重继承多重继承&#x... 查看详情

多重继承模糊基类

】多重继承模糊基类【英文标题】:Multipleinheritanceambiguousbaseclass【发布时间】:2015-05-1519:31:20【问题描述】:考虑代码structBase;structDerived:publicBase;structA:publicBase;structB:publicA,publicBase;structC:publicA,publicDerived;//whynoambiguityher 查看详情

kotlin继承

...承,可以使用open关键字进行修饰。openclassBase(p:Int)//定义基类classDerived(p: 查看详情

关于c++基类与派生类

当定义派生类的对象时,会首先调用基类的构造函数我听书上说(别管什么书),既然要初始化派生类的对象,那就同时也把基类也初始化吧1那这样一个动作有什么用2C++为什么要设置这一个过程:当定义派生类的对象时,会首... 查看详情

C++ 多重继承的真实例子是啥? [关闭]

...例——在现实世界中——在C++中使用多重继承(其中多个基类不是纯接口)是否有意义?【问题讨论】:+1在近20年的C++编程中我从未遇到过我需要使用多重继承 查看详情

当基类不包含数据成员时,是不是仍然需要虚拟继承?

】当基类不包含数据成员时,是不是仍然需要虚拟继承?【英文标题】:Isvirtualinheritancestillnecessarywhenbaseclassescontainnodatamembers?当基类不包含数据成员时,是否仍然需要虚拟继承?【发布时间】:2014-11-1119:35:23【问题描述】:以... 查看详情