对c++继承很困惑

really confused about c++ inheritance

本文关键字:继承 c++      更新时间:2023-10-16

所以我对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;
};

我这样做是正确的,还是我应该做我的子类内的大部分工作,如构造函数和解构函数?

如果在派生类实例化时这些属性的值是已知的,那么您就不需要在基类或派生类中定义这些设置器。可以将它们传递给派生类的构造函数中的基类。

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放在基类的公共部分,因为它们是您的接口的一部分,因此可以重用(例如,如果稍后添加更多派生类)。

对于普通属性,将getter和setter放在超类Package中,子类将从Package继承这些。

cost函数的基本实现(可以是空的)放在Package中,并在每个子类中重写它。

也在Package中提供虚析构函数。任何具有纯虚方法的类,其作用就像c++中的接口。

既然所有的包都有这三个属性,我要创建一个setter吗在package.cpp中,还是在每个子类中设置setter设置属性?

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

正确的。

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

如果我只是将package.cpp用作接口,我还需要它中的任何东西吗?

你应该实现这里所有子类的所有通用功能,例如,通过为实例变量赋值来实现价格、重量和跟踪号的通用设置是完全有意义的:

  double price;
  int weight;
  int trackingNumber;

您可能还想为基类(package.cpp)添加相同属性的getter