真的很困惑c ++继承

时间:2014-08-01 02:45:13

标签: c++ inheritance

所以我真的很困惑c ++继承。我一直在互联网上阅读,似乎无法很好地解决这个问题。

我有一个包类,包可以是Letter,Box或Crate。

每个包裹都有跟踪号,重量和价格。

需要从基类覆盖成本函数。所以我一直在写这个,似乎无法让它正常工作。

我主要对如何处理Package感到困惑。由于所有包都具有三个属性,我是否在package.cpp中创建一个setter,或者我是否会在每个子类中创建setter来设置属性?每个包都必须有自己的构造函数吗?在我的子类中,我只包括package.h,因为那是超类?如果我只是将它用作界面,我甚至需要package.cpp中的任何内容吗?

这是我的Package类的样子:

class Package{

protected:
  double price;
  int weight;
  int trackingNumber;

public:
  void setPrice(double price);
  void setWeight(int weight);
  void setTrack(int trackNum);

  virtual double cost(int weight) = 0;
};

我是否正确地执行此操作,还是应该在子类中执行大部分工作,例如构造函数和解构函数?

3 个答案:

答案 0 :(得分:1)

如果在实例化派生类时已知这些属性的值,则无需在基类或派生类中定义这些setter。您可以将它们传递给派生类的构造函数中的基础。

如,

class Package
{
public:
   Package(double price, int weight, int trackNum)
   {}
...
};

class DerivedPackage: public Package
{
public:
   // Pass to the contructor of the base class
   DerivedPackage(double price, int weight, int trackNum):
      Package(price, weight, trackNum)
   {}
...
};

如果在对象构造期间无法确定值(即,您需要在以后设置它们),我建议您将这些setter放到基类的公共部分,因为它们是您的一部分接口因此可以重复使用(例如,如果稍后添加更多派生类)。

答案 1 :(得分:1)

对于公共属性,将getter和setter置于超类Package中,子类将从Package继承这些。

cost中放置Package函数的基础(可能为空)实现,并在每个子类中覆盖它。

还在Package中提供虚拟析构函数。任何具有纯虚方法的类只能像C ++中的接口一样。

答案 2 :(得分:1)

  

由于所有包都有三个属性,我是否可以创建一个setter   在package.cpp中,或者我会在每个子类中创建setter   设置属性?   仅在package.cpp中,如果这些是所有子类的公共属性。

     

每个包都必须有自己的构造函数吗?

正确。

  

在我的子类中,我只包含package.h,因为那是超类?   是的,您需要包含它,因为子类定义将引用基类。

     

如果我只是将它作为一个接口使用,我是否甚至需要package.cpp中的任何内容?

您应该在此处实现所有子类共有的所有功能,例如:通过为实例变量赋值来实现价格,权重和跟踪号的通用设置器是完全合理的:

  double price;
  int weight;
  int trackingNumber;

您可能还希望将相同属性的getter添加到基类(package.cpp)