В моей программе есть абстрактный класс, от которого наследуются несколько классов. Каждый дочерний класс представляет переменную-член для хранения данных. Я заметил, что при попытке инициализировать дочерний класс, используя агрегатную инициализацию или список инициализаторов, я получаю ошибки, показанные ниже.
struct FooBase {};
struct Foo : FooBase { int value; };
int main()
{
Foo f = {8}; // "initializer for aggregate with no elements requires explicit braces"
Foo f{8}; // same error as above
}
Я подумал, что это потому, что Foo наследует конструкторы от FooBase, но у меня есть пара вопросов о поведении.
- Поскольку тип указывается во время компиляции, почему агрегатный конструктор
Foo
не имеет приоритета?
- Есть ли способ принудительно установить приоритет конструктора по умолчанию, чтобы возможна вышеуказанная инициализация?
- (немного шире) Как вообще (стандартные и агрегатные) конструкторы классов передаются их дочерним элементам?
Как я понимаю, опциями будет установка данных после инициализации (или создание метода установки) или явное определение конструктора для Foo
. Однако, в частности, в контексте последнего вопроса, что происходит с конструкторами перемещения и копирования? (Есть ли хорошая практика для обеспечения хорошего поведения классов при наследовании?)