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

Posted

技术标签:

【中文标题】以基类作为数据成员的派生类?【英文标题】:Derived class with base class as a data member? 【发布时间】:2019-08-23 09:41:56 【问题描述】:

我正在使用基于代理的框架对人口进行建模。除了动物繁殖时,区分雄性和雌性通常并不重要,在这种情况下,具有繁殖年龄的雌性代理很重要。然后,饲养员必须将动物作为数据成员。我试图获得这个框架的最干净的实现,但我不确定我目前的方法是否是最好的。

我目前有一个名为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 的公共成员函数/变量,但推测后代应该能够“了解”它们的母亲,因此基类可以具有指向派生类的指针成员。

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

【问题讨论】:

有没有没有后代的动物?如果不是,为什么Breeder 需要是一个不同的类? 它不包含基类。它包含一个指针。所以它和链表有类似的语义(如果你用std::vector&lt;std::unique_ptr&lt;Animal&gt;&gt; offsprings代替,它就像一棵树,代表一棵家谱)。 老问题 is a / has a。查找继承与组合。 请注意,每次您的饲养员分娩时,您都会杀死一个现有的后代...... @Artyer 感谢您的澄清。我很快也会包含指针向量来保存多个帧。 【参考方案1】:

我的问题是让派生类带有一个基类的成员变量让我感觉很尴尬。尴尬吗?

一点也不(必然)。如果这符合您的领域逻辑,那么这可能是一个非常好的解决方案。

【讨论】:

好的,谢谢!我认为这是非常循环的,表明可能需要更好的结构。 它具有灵活性,因此可以模拟通常的情况,例如马和驴的后代是非繁殖的骡子(尽管some mares have bred)。或者,您可能正在为更奇幻的东西建模,例如龙和驴(它们的后代可能是也可能不是饲养员)。【参考方案2】:

这正是对象链表的外观。

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

这完全没有错。继续。 ?


次要风格建议:使用 MaleFemale 成员创建 sex_enum class,而不是仅在 cmets 中提供映射的 int。当您的眼睛离开声明时,您会发现更容易阅读,也更容易避免错误。

【讨论】:

以上是关于以基类作为数据成员的派生类?的主要内容,如果未能解决你的问题,请参考以下文章

具有类继承和具有基类作为派生类中的数据成员之间有明显的区别吗?

继承与派生

5继承与派生2-访问控制

当我在 C++ 中派生一个类时,它是不是会创建一个基类对象并将其作为我的成员变量存储在派生类中?

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?