使用继承初始化C++中的参数



我读到在C++中过度使用继承是不好的。 我有一个简单的例子,我想知道用它来初始化基类构造函数中的值是好是坏。

假设我有一个类动物:

class Animal{
protected :
Animal(std::string name, std::string category);
std::string m_name;
std::string m_category;
};

为应用程序将使用的每种动物创建一个特定的类是否好,例如:

class Bear : public Animal{
public :
Bear():Animal("Bear", "Mammal"){
}
};

当然,这意味着如果我有100只动物,我需要100节课,这让我感到尴尬。 在此示例中,我仅使用继承来初始化值,不会涉及任何特定的虚拟方法。

谢谢

从广义上讲,选择是创建派生类还是只在一个类上拥有数据成员,变成了一个问题,即更多的类是否真的有助于解决你在软件中尝试建模/求解的情况。

例如,关心车辆如何行驶的应用程序可能具有不同的汽车、轮船、飞机、直升机等类别。另一方面,只关心车辆存在的应用程序(例如用于跟踪企业拥有的东西(可能只需要一个车辆类。

作为一个经验法则,问问自己派生类是否实际上会以任何方式表现不同,就程序的其余部分而言。如果是,则派生类可能是您想要的。如果不是,那么可能不是。

在您的特定情况下,两者之间是否会有任何真正的区别

Bear bear;

Animal bear("Bear", "Mammal");

如果不是,那么每种类型的 Animal 的派生类听起来有点过分(100 个派生类通常听起来过多(,您可能希望根据您希望如何存储数据执行其他操作。也许对Animal实例进行listmap

通常,在基类中包含成员不是一个好的做法。 而不是这样,创建一个接口并在返回值的派生类中提供一个实现:

class Animal {
protected:
virtual std::string getName() const;
virtual std::string getCategory() const;
};
class Bear : public Animal{
public:
virtual std::string getName() const override {
return std::string("Bear");
}
virtual std::string getCategory() const override {
return std::string("Mamal");
}
};

当您有不同的实现情况但仍具有相同的工作基础时,继承很有用。在您的情况下,如果您所有动物之间的唯一区别是名称和类别,并且没有特定的实现,那么我个人认为这是没有用的。

但是,在您的情况下可以改进的是需要 2 个定义相同事物的参数(例如,熊总是哺乳动物(。也许地图可以在您的情况下解决此问题?

为每只动物创建一个类似乎过分了。我之前做过一个学校作业,在那里我使用动物课,我把衍生的班级变成了捕食者和猎物。因此,使派生的动物成为特定类型的动物,例如哺乳动物,鱼类等。对于您的示例,您可以只使用单个 Animal 类并调用该 Animal bear。

最新更新