以基类作为数据成员的派生类?
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<std::unique_ptr<Animal>> offsprings
代替,它就像一棵树,代表一棵家谱)。
老问题 is a / has a。查找继承与组合。
请注意,每次您的饲养员分娩时,您都会杀死一个现有的后代......
@Artyer 感谢您的澄清。我很快也会包含指针向量来保存多个帧。
【参考方案1】:
我的问题是让派生类带有一个基类的成员变量让我感觉很尴尬。尴尬吗?
一点也不(必然)。如果这符合您的领域逻辑,那么这可能是一个非常好的解决方案。
【讨论】:
好的,谢谢!我认为这是非常循环的,表明可能需要更好的结构。 它具有灵活性,因此可以模拟通常的情况,例如马和驴的后代是非繁殖的骡子(尽管some mares have bred)。或者,您可能正在为更奇幻的东西建模,例如龙和驴(它们的后代可能是也可能不是饲养员)。【参考方案2】:这正是对象链表的外观。
一旦您将 一个 后代更改为多个后代的集合,这将是一棵对象树的外观。
这完全没有错。继续。 ?
次要风格建议:使用 Male
和 Female
成员创建 sex_
和 enum class
,而不是仅在 cmets 中提供映射的 int
。当您的眼睛离开声明时,您会发现更容易阅读,也更容易避免错误。
【讨论】:
以上是关于以基类作为数据成员的派生类?的主要内容,如果未能解决你的问题,请参考以下文章
具有类继承和具有基类作为派生类中的数据成员之间有明显的区别吗?
当我在 C++ 中派生一个类时,它是不是会创建一个基类对象并将其作为我的成员变量存储在派生类中?