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

Posted

技术标签:

【中文标题】我是不是将基类与超类一起继承以进行多重继承?【英文标题】: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”的基本构造函数。您还应该考虑在构造后这些值是否需要可变;在可能的情况下,在构造时提供此类配置通常会更好/更干净,然后在成功创建对象后使状态不可变,尽管这实际上取决于有关您的使用/应用程序的更多细节。

以上是关于我是不是将基类与超类一起继承以进行多重继承?的主要内容,如果未能解决你的问题,请参考以下文章

多重继承,虚基类

多重继承

《C#高级编程》读书笔记

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

大型程序的工具——多重继承与虚继承

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