Из-за проблем с производительностью я не могу использовать dynamic_cast
или virtual function
. Теперь мне нужно получить дочерний объект из указателя родительского класса, переданного в функцию. Информация о том, на какой дочерний объект он указывает, недоступна. Динамическое приведение решило бы эту проблему, если бы было разрешено использовать.
В качестве обходного пути в настоящее время я храню перечисление, содержащее информацию о типе дочернего объекта в базовом классе. Как только мы получаем указатель базового класса, я выбираю тип объекта производного класса, на который он указывает, чтобы сформировать значение, хранящееся в enum, а затем выполняю static_cast
.
Я знаю, что это неправильное решение. Есть ли сценарий, который может провалиться? И есть ли другое решение?
#include <iostream>
using namespace std;
enum class Type{
Derived1,
Derived2
};
class Base{
public:
Type type;
Base(){};
Base(Type t){type = t;}
void print(){cout<<"in Base"<<endl;}
};
class Derived1: public Base{
public:
Derived1():Base(Type::Derived1){}
void print(){cout<<"in Derived1"<<endl;}
void run(){cout<<"in Derived1"<<endl;}
};
class Derived2: public Base{
public:
Derived2():Base(Type::Derived2){}
void print(){cout<<"in Derived2"<<endl;}
void run(){cout<<"in Derived2"<<endl;}
};
int main()
{
Base* a = new Derived1();
Derived1* b;
if(a->type == Type::Derived1){
b= static_cast<Derived1*>(a);
}
b->print(); \\in Derived2
b->run(); \\in Derived2
return 0;
}