#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>(); }
}