我是否继承了基类和超类以进行多重继承?

时间:2014-08-02 02:54:49

标签: c++ inheritance multiple-inheritance

所以我试图在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

Cost是包中的虚函数,所有类都有自己的实现。 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 –

讨论已经转移到了一个以更详细的方式解释的东西

1 个答案:

答案 0 :(得分:0)

构造代码有不同的方法,但在面向对象的设计方面,通常最好不要在基类中包含任何状态或实现,并且只在最终的具体类中包含状态和实现。一个原因是,常见的情况是实现与基类所考虑的实现集大不相同,因此基础使用的存储变得不适合特定实现。另一个原因是在基类中提供实现可能会对实现可能不知道或容易破解的实现施加额外的不变量和约束。

简而言之,更好的结构化方法是:

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”,你也不应该把变量“保护”或“公开”;所有成员变量都应该是“私有的”(如果派生类需要访问权限,请考虑使用“受保护”访问者)。