Выберите реализацию родительского класса во время выполнения - PullRequest
0 голосов
/ 10 февраля 2020

В довольно большом проекте у меня есть класс Parent1, который наследуется несколькими производными классами. Мне нужно добавить новую реализацию для альтернативной реализации родительского класса. Выбор использования Parent1 или Parent2 будет сделан во время выполнения.

Минимальный пример будет таким, как показано ниже.

текущая настройка

class Parent1 {
    void doParentStuff() {
        std::cout << 0 << std::endl;
    }
};

class Derived : Parent1 {
     void doChildStuff() {
          doParentStuff();
     }
};

Требуемая настройка

Теперь я хочу добавить новый файл, содержащий реализацию Parent2, который будет выглядеть следующим образом:

class Parent2 {
    void doParentStuff() {
        std::cout << 1 << std::endl;
    }
};

Может быть, я создаю новый класс Parent, который является базовым классом Parent1 и Parent2

, и в идеале класс Derived теперь должен выглядеть следующим образом:

class Derived : Parent {
     Derived( bool whichParent ) {
         // decide here whether to inherit from Parent1 or Parent2
     }
     void doChildStuff() {
          doParentStuff(); // this will print 0 or 1, with the choice made at runtime
     }
}

Очевидно, что чистым решением было бы изменить дизайн с наследования на композицию. Тем не менее, я пытаюсь сделать эту работу в кратчайшие сроки, с наименьшим количеством дополнительного кода при сохранении структуры наследования. Это вообще возможно?

1 Ответ

2 голосов
/ 10 февраля 2020

Этого нельзя сделать.

Однако вы можете попробовать что-то вроде этого:

class SuperParent { ... };

class Parent1 : public SuperParent { ... };
class Parent2 : public SuperParent { ... };

template<class Base>
class Derived : public Base { ... };

SuperParent * derivedFactory(bool which) {
    if (which) {
        return new Derived<Parent1>();
    } else {
        return new Derived<Parent2>();
    }
}

, если результирующая иерархия наследования обеспечивает необходимую вам функциональность.

...