c ++ динамический тип возврата для функции - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь создать универсальный класс, который может возвращать объект другого класса в зависимости от входных данных универсального класса.

Из основной функции, если я передаю '1' в качестве аргумента конструктору универсального класса, я хочу иметь возможность получить объект класса child1 с помощью getType ().Мой вопрос: есть ли способ динамически изменить тип возвращаемого значения getType () или любой другой способ выполнить это поведение?

Моя текущая реализация вызывает метод print () базового класса, даже если я создаюобъект дочерних классов в универсальном конструкторе, поскольку m_type является базовым типом.

class base {

    public:
        void print(){
            cout << "base\n";
        }
        virtual ~base() {}
};

class child1 : public base {
    public:
        void print(){
            cout << "child1\n";
        }
};

class child2 : public base {
    public:
        void print(){
            cout << "child2\n";
        }
        void hello(){
            cout << "hello from child 2\n";
        }
};

class generic{

    public:
        generic(int b){
            if(b==1) {
                m_type = new child1();
            }
            else if(b==2) 
                m_type = new child2();
        }

    // Somehow return the object of one of the child class based on input 
    // to constructor.
    base *getType(){
        return m_type;
    }

    base *m_type;
};

int main()
{
    generic *g1 = new generic(1);
    // call the method from child1 class instead of base class.
    g1->getType()->print();
    return 0;
}

1 Ответ

0 голосов
/ 27 декабря 2018

Сделать print виртуальным в base.

Не виртуальные методы не ведут себя полиморфно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...