Абстрактная переменная, которая должна быть инициализирована в конструкторе

#c #abstract-class

#c #абстрактный класс

Вопрос:

У меня есть класс (назовем его Example ), который сам имеет переменную child . Эта переменная является объектом любого класса Child1 или Child2 которые оба являются дочерними элементами абстрактного класса Father . Я бы хотел, чтобы это было определено в конструкторе. Это то, что я пытаюсь:

 class Example {
public:
    Father child;  //This does not work because father is abstract
};

Example::Example(bool use_1) {
    if use_1 { child = Child1(); }
    else { child = Child2(); }
}
 

В настоящее время я определяю оба объекта для public и инициализирую только один, но это кажется довольно уродливым.

 class Example {
public:
    Child1 child1;
    Child2 child2;
    //father child;  This does not work because father is abstract
};

Example::Example(bool use_1) {
    if use_1 { 
        child1 = Child1(); // I would like to use child only here...
    }
    else { 
        child2 = Child2(); // ... and here
    }
}
 

Есть ли лучший способ сделать это?

Комментарии:

1. У вас не может быть объекта (дочернего), который может быть любого типа (Child1, Child2, other, …), Который приблизительно равен std::variant . Ваш второй вариант (имеющий оба объекта) является правильным. Во всяком случае, это кажется очевидным случаем использования шаблонов.

Ответ №1:

Предполагая, что ваш Child1 и Child2 является производным от Father , это стандартный случай динамического полиморфизма. Вам нужно удерживать указатель (обычно интеллектуальный указатель) вместо самого объекта:

 class Example {
public:
    std::unique_ptr<Father> child;
};

Example::Example(bool use_1) {
    if( use_1 ) { child = std::make_unique<Child1>(); }
    else { child = std::make_unique<Child2>(); }
}