Я пытаюсь изучить тип отливки из базового класса в производный класс. Этот образец покажет вам, что я пытаюсь сделать. Я знаю, что это недействительное решение. Я просто пытаюсь создать динамическую архитектуру для своего программного обеспечения и открыть для себя советы, решения.Преобразование производного типа в базовый тип
enum EComponentType
{
Base = 0,
Material = 1
};
class FComponent
{
public:
FComponent() { m_type = EComponentType::Base; }
EComponentType type() { return m_type; }
protected:
EComponentType m_type;
};
class FMaterial : public FComponent
{
public:
FMaterial() { m_type = EComponentType::Material; }
void setValue(int value) { m_value = value; }
int value() { return m_value; }
private:
int m_value;
};
int main(int argc, char *argv[])
{
FMaterial material;
material.setValue(22);
QVector<FComponent> Components;
Components << material;
for (int i = 0; i < Components.size(); i++)
{
switch (Components[i].type())
{
case EComponentType::Material:
FMaterial material = (FMaterial)(Components[i]); // --> invalid of course
int value = material.value();
break;
}
}
return 0;
}
Update 1:
int main(int argc, char *argv[])
{
QVector<FComponent*> Components;
FMaterial material;
material.setValue(22);
Components << &material;
for (int i = 0; i < Components.size(); i++)
{
switch (Components[i]->type())
{
case EComponentType::Material:
FMaterial *m = static_cast<FMaterial*>(Components[i]);
int value = m->getValue();
qDebug() << value;
break;
}
}
return 0;
}
Так это хороший выбор из-за работы или по другим причинам? Будет много классов и много типов?
Если вы храните экземпляры базового класса по значению в контейнере, это никогда не будет работать, потому что вы не можете поместить производные экземпляры в контейнер по значению. Вы должны хранить указатели базового класса 'FComponent *' в контейнере в вашем случае. В этом случае вы можете создавать производные экземпляры с помощью 'new', а затем производный указатель экземпляра может быть легко введен в указатель базового класса, и его можно поместить в контейнер. Также не забудьте предоставить виртуальный деструктор в базовом классе, если вы «удаляете» экземпляры с помощью указателей базового класса. – pasztorpisti
Вы должны ** никогда ** не нуждаться в проверке типа ничего, виртуальные функции там, чтобы обрабатывать различия между базой и производными автоматически. И литье, полученное на базу, нонсенс, объект производного * есть * базового класса. Как и вы, как участник [SO], все еще человек. – vonbrand
@vonbrand вы можете объяснить больше или просто создать образец сообщения, например, производный класс B имеет член «int b», а производный класс C имеет член «int c». Как их использовать. Как читать их значения? –