对c++继承很困惑
really confused about 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;
};
我这样做是正确的,还是我应该做我的子类内的大部分工作,如构造函数和解构函数?
如果在派生类实例化时这些属性的值是已知的,那么您就不需要在基类或派生类中定义这些设置器。可以将它们传递给派生类的构造函数中的基类。
。
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
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象