所以我真的很困惑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;
};
我是否正确地执行此操作,还是应该在子类中执行大部分工作,例如构造函数和解构函数?
答案 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)