C++ 如何将多个继承类放在同一个数组中?

C++ 如何将多个继承类放在同一个数组中?,c++,inheritance,C++,Inheritance,我有几个类,ObjDef,PeopDef,NpcDef和PlyDef,这样PlyDef和NpcDef分别继承PeopDef,而PeopDef继承ObjDef。每个类都有构建在其前面的类上的功能,因此在ObjDef::Tick之前调用PeopDef::Tick非常重要。我将每个对象都存储在向量对象中,但是当主tick循环遍历它们时,我希望它们调用原始类的tick,而不是ObjDef::tick,这是向量当前所做的。有没有办法做到这一点,或者每个类都必须有一个单独的向量?您可以在向量中存储一个Obj

我有几个类,
ObjDef
PeopDef
NpcDef
PlyDef
,这样
PlyDef
NpcDef
分别继承
PeopDef
,而
PeopDef
继承ObjDef。每个类都有构建在其前面的类上的功能,因此在
ObjDef::Tick
之前调用
PeopDef::Tick
非常重要。我将每个对象都存储在
向量对象中,但是当主tick循环遍历它们时,我希望它们调用原始类的tick,而不是
ObjDef::tick
,这是
向量当前所做的。有没有办法做到这一点,或者每个类都必须有一个单独的向量?

您可以在向量中存储一个ObjDef指针(ObjDef*或智能指针),并使Tick方法成为虚拟的

下面是一个例子:

#include <iostream>
#include <vector>
#include <memory>

class ObjDef
{
public:
    virtual void Tick()
    {
        std::cout << "ObjDef::Tick\n";
    }
};

class PeopDef : public ObjDef
{
public:
    virtual void Tick()
    {
        std::cout << "PeopDef::Tick\n";
    }
};

int main()
{
    std::vector<std::shared_ptr<ObjDef>> objects;

    std::shared_ptr<ObjDef> obj(new ObjDef());
    std::shared_ptr<ObjDef> peop(new PeopDef());

    objects.push_back(obj);
    objects.push_back(peop);

    for (auto object : objects)
    {
        object->Tick();
    }

    return 0;
}
#包括
#包括
#包括
类ObjDef
{
公众:
虚空勾号()
{

std::cout如果勾选是虚拟的,它应该能正常工作。如果不是真的,它只有在它的虚拟和向量存储指针或引用而不是具体对象时才会工作。你应该开始。根据对象的生存期和内存管理,最好使用
std::shared\u ptr
isntead。使共享函数e
::Init
::Tick
virtual没有更改任何内容,它仍然使用
ObjDef
函数。将
vector
更改为
vector
大约需要40个“表达式必须具有类类型”错误。我必须查看更多的代码才能知道这些错误是关于什么的,但我添加了一个快速示例。虽然这里不需要它(因为
共享的\u ptr
),但通常最好定义
虚拟的
数据,或者如果一个类打算通过基类指针存储。(实际上,如果打算从中继承类,通常是个好主意。)我建议将
std::unique_ptr
置于
std::shared_ptr
之上。后者会增加不必要的开销。