C++父类子类,使用向量
Posted
技术标签:
【中文标题】C++父类子类,使用向量【英文标题】:C++ Parent class Sub class , working with vector 【发布时间】:2020-10-09 02:36:14 【问题描述】:C++
嗨,所以基本上我做了一个 Animal Parent 类 并将鼠标作为我的子类之一。
鼠标有一个独特的功能(不在父类中)get_scare:
void get_scare()
在main中,我创建了一个Animal Object的向量:
vector<Animal> list_animal
我的问题是在确定子类鼠标位于 list_animal 中的 索引 i 后,我无法访问我的 get_scare 函数。我只能访问 Animal(父类)中的函数。
如何在鼠标中访问特定功能,同时保留我的 Animal 向量。
这就是我所做的:
if (list_animals[i]->get_animal_name() == "Mouse")
list_animals[i] -> get_scare(); //Doesn't let me do that
我知道它不允许我这样做,因为对象是动物,我该如何解决这个问题!
谢谢!
【问题讨论】:
最好的方法是将get_scare
作为virtual
函数添加到Animal
,这样Animal
的持有者就不需要知道他们拥有什么样的Animal
.如果这令人不快,请使用dynamic_cast
测试您是否有Mouse
,然后在转换后的指针上调用get_scare
。这个问题会有一些重复,所以在网站上四处看看,看看你能不能在我之前找到一个。
此外,不可能将Mouse
实例存储在vector<Animal>
中,因为该向量仅包含一种类型。要在该向量中存储任意 Animal 实例,您至少需要 vector<Animal*>
。最好不要使用原始指针,而是使用std::unique_ptr
或std::shared_ptr
。如果您可能会引入其他“吓人”的动物,您甚至可以选择使用带有“Scareable”接口的多重继承,并在处理“scares”时将其与dynamic_cast
一起使用。或者您可以考虑将其移至基类并引入“恐慌因素”。
【参考方案1】:
首先,您不能声明vector<Animal>
并在其中存储子类对象——这是一个错误。例如,如果您有
vector<Animal> list_animal(1);
list_animal[0] = Mouse;
然后Mouse
中不在Animal
中的任何数据成员都将被丢弃 - 这称为切片。
但也许这只是您的问题中的一个错字,因为您在其他地方使用了list_animals[i]->
。假设您改为声明 vector<Animal*>
。在这种情况下,你可以使用 cast 来做你想做的事:
if (list_animals[i]->get_animal_name() == "Mouse")
static_cast<Mouse*>(list_animals[i])->get_scare();
然而,这不是一个好的面向对象的设计。假设Animal
有一个虚拟析构函数(它应该有),一个稍微好一点的方法是使用dynamic_cast
而不是依赖get_animal_name()
:
if (auto mouse = dynamic_cast<Mouse*>(list_animals[i]))
mouse->get_scare();
这仍然不是典型的面向对象设计。通常,您要么将get_scare()
添加到Animal
中,要么仅在Mouse
而不是Animal
可用时使用该功能。
最后,你必须注意谁拥有动物衍生的对象。通常你希望向量拥有它们,在这种情况下你需要一个智能指针的向量:vector<unique_ptr<Animal>>
或vector<shared_ptr<Animal>>
。
【讨论】:
非常感谢您的回答!!是的,这是一种奇怪的方法,但我有指导方针!!!以上是关于C++父类子类,使用向量的主要内容,如果未能解决你的问题,请参考以下文章
C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?
当我使用父类指针将它们添加到向量时,我不能使用子类特定的功能