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>>
.
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>>
.