Что происходит с тем, что совокупный общедоступный базовый класс (или даже несколько совокупных общедоступных базовых классов) приведет к тому, что класс потеряет хорошие свойства агрегатных классов?Почему базовый класс дисквалифицирует класс от агрегата?
Определение «совокупного базового класса» от http://en.cppreference.com/w/cpp/language/aggregate_initialization http://en.wikipedia.org/wiki/C++_classes#Aggregate_classes
Хорошие свойства агрегированных классов:
- Без определения конструктора, агрегат типа может быть инициализирован путем передачи список значений, заключенный в фигурные скобки, для инициализации его членов (или базовых классов, если они позволили им).
- Совокупные типы считаются «простыми» (обобщение PODs) и могут использоваться в качестве литературного типа для целей
constexpr
s.
Сокращенный пример инициализации из http://en.cppreference.com/w/cpp/language/aggregate_initialization#Example:
#include <string>
#include <array>
struct S {
int x;
struct Foo {
int i;
int j;
int a[3];
} b;
};
int main()
{
S s1 = { 1, { 2, 3, {4, 5, 6} } };
S s2 = { 1, 2, 3, 4, 5, 6}; // same, but with brace elision
}
Смотрите также: What are Aggregates and PODs and how/why are they special?
Я предполагаю, что это потому, что вы не сможете инициализировать элементы такого агрегата, используя список инициализаторов. – Praetorian
Какие «приятные свойства» в частности вас беспокоят? Перечислите их, дайте примеры того, как они должны работать с пустым и непустым базовым классом и виртуальным наследованием, и к тому времени, когда вы это сделаете, у вас будет ваш ответ. Или еще гораздо лучший вопрос. –
Итак, теперь, кажется, ваше высказывание все, что вам действительно нужно, - это написать один менее конструктор, конструктор, который, вероятно, будет только одной строкой. – aaronman