2013-09-12 3 views
0

У меня есть несколько классов, ObjDef, PeopDef, NpcDef и PlyDef, так что PlyDef и NpcDef каждый по отдельности наследуют PeopDef и PeopDef наследуемого ObjDef. Каждый класс имеет функциональность, которая строится на классе перед ним, поэтому важно, чтобы PeopDef::Tick вызывается до ObjDef::Tick. У меня есть каждый объект, хранящийся в vector<ObjDef> object, но когда идет цикл основного галочка, я хочу, чтобы они вызывали исходные классы «Tick», а не ObjDef::Tick, что и делает сейчас vector<ObjDef>. Есть ли способ сделать это, или у меня должен быть отдельный вектор для каждого класса?Как я могу наследовать несколько унаследованных классов в одном массиве?

+0

Он должен работать правильно, если 'Tick' является виртуальным. –

+2

Не верно, он будет работать, только если его виртуальный * и * вектор сохраняет указатели или ссылки вместо конкретных объектов. – japreiss

+1

Вы должны начать [здесь] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – molbdnilo

ответ

2

Вы можете сохранить указатель 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; 
} 
+1

В зависимости от времени жизни объекта и управления памятью может быть лучше использовать 'std :: shared_ptr ' isntead. –

+0

Создание общих функций, таких как ':: Init' и' :: Tick', ничего не изменило, оно все еще использовало функции 'ObjDef'. Изменение 'vector ' '' vector 'около 40" выражение должно иметь тип класса "ошибки. –

+1

Мне нужно будет увидеть больше кода, чтобы узнать, что эти ошибки, но я добавил быстрый пример. –

Смежные вопросы