Приведение указателя объекта базового класса к указателю на объект производного класса без использования dynamic_cast - PullRequest
1 голос
/ 18 октября 2019

Из-за проблем с производительностью я не могу использовать 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;
}

...