【发布时间】:2015-04-19 16:59:04
【问题描述】:
如果我有一个简单的 2 级类层次结构,例如,这个:
// level 1
class Spare_Part{
private:
string name;
double price;
public:
Spare_Part();
string getName() { return name; }
double getPrice() { return price; }
virtual int getQuantity() { return -1; }; // may also define it as pure virtual
};
//level 2
class On_hand : public Spare_Part{
private:
int quantity;
string location;
public:
On_hand();
int getQuantity(){ return quantity; }
};
我想使用指向基类“Spare_part”的指针访问“On_hand”类中的成员“quantity”,因此我将“getQuantity”函数设为虚拟函数。代码工作正常,但是,我觉得我不应该有一个 get/set 函数(即使是一个虚拟函数)来访问在层次结构中某处定义的成员。这真的被认为是一种不好的做法,应该通过重新设计类来避免吗? 编辑:整个层次结构有点复杂。除了“On_hand”类别之外,还有通过合同供应商提供的零件类别。假设是我无法知道供应商有多少零件可用,这就是为什么基类中不包含“数量”。
【问题讨论】:
-
上面的代码是不好的做法。它包含标志值 (
-1),并且不必要地使用了多态性(为什么手头上没有的备件只不过是没有位置和数量的备件?拥有一个可选的(子集)属性不足以证明多态性,特别是因为(在上述情况下)很明显该属性并不是真正可选的(因为它在根类型中公开!)甚至您的访问器:spare_part 不仅仅是平面数据吗? -
补充一下 Yakk 的说法:听起来你正在用派生类的信息污染你的基类。也许您正在尝试获取 Spare_Part* 的列表,但能够讲述有关 On_hand 的信息,并且您希望在不使用联合或进行动态转换的情况下做到这一点。也许您应该考虑在层次结构中间实现您需要的另一个类。
-
@Yakk 整个层次结构有点复杂。除了“On_hand”类别之外,还有通过合同供应商提供的零件类别。假设是我无法知道供应商有多少零件可用,这就是为什么基类中不包含“数量”。
标签: c++ function polymorphism virtual