将基类作为数据成员的派生类?

时间:2019-08-23 09:41:56

标签: c++ inheritance composition

我正在使用基于代理的框架对人群进行建模。通常,区分雄性和雌性并不重要,除了动物繁殖时,在雌性中繁殖年龄的雌性很重要。这样,育种者必须将动物作为数据成员。我正在尝试最干净地实现此框架,但不确定当前的方法是否最佳。

我目前有一个名为Animal的基类和一个名为Breeder的派生类。 Breeder有一个唯一的指针数据成员来表示其后代,该成员是动物类型:

#include <iostream>
#include <memory>

class Animal
  {
     private:
       int id_;
      protected:
       int sex_; // 0 = female, 1 = male

      public:
         Animal() {};
         Animal(int id): id_(id) { };
         int get_id() const { return id_; };
};

class Breeder : public Animal {

     public:
       Breeder(int id) : Animal(get_id())
        { 
            sex_ = 0; 
            id_b = id;
        };

    private:
       int id_b;
        std::unique_ptr<Animal> offspring;

    public:
        void give_birth() {
           std::cout << "breeder " << id_b << " is giving birth" << std::endl;
            offspring = std::make_unique<Animal> (id_b+1);
        };
        int get_id_b() { return id_b; };
        int get_offspring_id() { return offspring->get_id(); };
};

我的问题是让派生类具有属于基类的成员变量感到很尴尬。尴尬吗?

此外,育种者可以访问fpsring的公共成员函数/变量的个体,但是推测后代应该能够“了解”其母亲,因此基类可以具有指向派生类的指针成员。

有没有更好的方法来解决这个问题?也许使用合成的两个不同的类?例如,育种班是否应该具有生育的功能?

2 个答案:

答案 0 :(得分:3)

  

我的问题是让派生类具有属于基类的成员变量感到很尴尬。尴尬吗?

完全没有(必要)。如果这符合您的领域逻辑,那可能是一个很好的解决方案。

答案 1 :(得分:1)

这正是对象的链接列表的外观。

一旦将您的一个后代更改为多个后代的集合,这将完全是一棵对象树的外观。

一点都没有错。继续。 ?


次要风格建议:将sex_设为具有enum classMale成员的Female,而不是int,仅在注释中给出映射。当您将视线从声明中移开时,您会更容易阅读,并且也避免了错误。