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&lt;Animal&gt; 中,因为该向量仅包含一种类型。要在该向量中存储任意 Animal 实例,您至少需要 vector&lt;Animal*&gt;。最好不要使用原始指针,而是使用std::unique_ptrstd::shared_ptr。如果您可能会引入其他“吓人”的动物,您甚至可以选择使用带有“Scareable”接口的多重继承,并在处理“scares”时将其与dynamic_cast 一起使用。或者您可以考虑将其移至基类并引入“恐慌因素”。 【参考方案1】:

首先,您不能声明vector&lt;Animal&gt; 并在其中存储子类对象——这是一个错误。例如,如果您有

vector<Animal> list_animal(1);
list_animal[0] = Mouse;

然后Mouse 中不在Animal 中的任何数据成员都将被丢弃 - 这称为切片

但也许这只是您的问题中的一个错字,因为您在其他地方使用了list_animals[i]-&gt;。假设您改为声明 vector&lt;Animal*&gt;。在这种情况下,你可以使用 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&lt;unique_ptr&lt;Animal&gt;&gt;vector&lt;shared_ptr&lt;Animal&gt;&gt;

【讨论】:

非常感谢您的回答!!是的,这是一种奇怪的方法,但我有指导方针!!!

以上是关于C++父类子类,使用向量的主要内容,如果未能解决你的问题,请参考以下文章

C++ 当子类的方法和父类的方法重名时...

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?

关于C++父类与子类之间变量的问题

当我使用父类指针将它们添加到向量时,我不能使用子类特定的功能

C++ 中,类的继承:父类当使用虚函数时候,子类对该函数进行重写的话,属于子类成员函数对虚函数的覆盖!

C++中子类的变量能不能覆盖父类的变量?