C++ Parent class Sub class ,使用向量

C++ Parent class Sub class , working with vector

C++

嗨,基本上我做了一个 Animal Parent class 并将 Mouse 作为我的 SubClass.

之一

鼠标有一个独特的功能(父class没有)get_scare :

void get_scare()

主要是,我创建了一个动物对象向量:

vector<Animal> list_animal

我的问题是在 class 鼠标位于 索引 i in list_animal 之后,我无法访问我的 get_scare 功能。我只能访问 Animal (Parent Class) 中的函数。

如何在鼠标中访问特定功能,同时保留我的 Animal 向量。

这是我所做的:

if (list_animals[i]->get_animal_name() == "Mouse") {
         
                list_animals[i] -> get_scare(); //Doesn't let me do that

            }

我知道它不允许我这样做,因为对象是动物,我该如何解决这个问题!

谢谢!

首先,您不能声明 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();
    }

然而,这并不是一个好的 object-oriented 设计。假设 Animal 有一个虚拟析构函数(它应该有),稍微好一点的方法是使用 dynamic_cast 而不是依赖 get_animal_name():

if (auto mouse = dynamic_cast<Mouse*>(list_animals[i])) {
    mouse->get_scare();
    }

这仍然不是典型的 object-oriented 设计。通常,您可以将 get_scare() 添加到 Animal 中,或者仅在 Mouse 而不是 Animal 可用时才使用该函数。

最后,你要注意谁拥有Animal-derived对象。通常您希望向量拥有它们,在这种情况下,您需要 智能指针 的向量:vector<unique_ptr<Animal>>vector<shared_ptr<Animal>>.