Как вы упомянули, вы можете хранить полиморфные указатели в базовом классе:
class Employee {
public:
std::vector<Project*> projs;
}
и использовать dynamic_cast
, чтобы понизить их:
dynamic_cast<Building*>(projs[i])->doSomething();
Но я бы не рекомендовалэтот подход (если не требуется), так как это потребует от вас управления памятью за этими указателями.(Который, конечно, может быть выгружен, например, до std::unique_ptr
.)
Если вы не хотите, чтобы Employee был полиморфным классом, гораздо более простой подход состоял бы в использовании шаблона класса
template <typename T>
class Employee {
public:
std::vector<T> projs;
}
, который можно использовать так:
class Architect : public Employee<Building> {
};
Architect architect;
architect.projs.push_back(Building());