Вопрос 1: Конструкторы по умолчанию инициализируют члены POD равными 0 в соответствии со стандартом C ++. Смотри приведенный ниже текст.
Вопрос 2. Если конструктор должен быть указан в базовом классе, этот класс не может быть частью объединения.
Наконец, вы можете предоставить конструктор для вашего объединения:
union U
{
A a;
B b;
U() { memset( this, 0, sizeof( U ) ); }
};
Для Q1:
Из C ++ 03, 12.1 Конструкторы, стр 190
Неявно определенный конструктор по умолчанию выполняет набор инициализаций
класс, который будет выполняться пользовательским конструктором по умолчанию для этого класса с пустым списком mem-initializer-list (12.6.2) и пустым телом функции.
Из C ++ 03, 8.5 Инициализаторы, стр. 145
По умолчанию инициализировать объект типа T означает:
- если T не тип класса POD
(раздел 9), конструктор по умолчанию
для Т называется (а
инициализация плохо сформирована, если T
не имеет доступного по умолчанию
конструктор);
- если T является типом массива, каждый элемент инициализируется по умолчанию;
- в противном случае объект инициализируется нулями .
Инициализация нуля объекта типа T означает:
- если T - скалярный тип (3.9), объекту присваивается значение 0 (ноль), преобразованное в T;
- если T является типом класса, не являющимся объединением, каждый нестатический член данных и каждый подобъект базового класса инициализируются нулями ;
- если T является типом объединения, первый именованный элемент данных объекта инициализируется нулями;
- если T является типом массива, каждый элемент инициализируется нулями;
- если T является ссылочным типом, инициализация не выполняется.
Для Q2:
Из C ++ 03, 12.1 Конструкторы, стр 190
Конструктор является тривиальным, если он является неявно объявленным конструктором по умолчанию и если:
- его класс не имеет виртуальных функций (10.3) и виртуальных базовых классов (10.1), а
- все прямые базовые классы этого класса имеют тривиальные конструкторы, а
- для всех нестатических членов данных своего класса, которые имеют тип класса (или массив)
из них) каждый такой класс имеет тривиальный конструктор
Из C ++ 03, 9,5 Союзов, стр. 162
Объединение может иметь функции-члены (включая конструкторы и деструкторы), но не виртуальные (10.3) функции. У союза не должно быть базовых классов. Объединение не должно использоваться в качестве базового класса. Объект класса с нетривиальным конструктором (12.1), нетривиальным конструктором копирования (12.8), нетривиальным деструктором (12.4) или нетривиальным оператор копирования (13.5.3, 12.8) не может быть членом объединения, а также не может содержать массив таких объектов