Во-первых, typedef
для структуры ничего не меняет, он вводит альтернативное имя для типа. Вы все равно можете наследовать его, как обычно.
Синтаксис Type identifier{params}
для определения - синтаксис C++ 0x для нового uniform initialization. В pre-C++ 0x у вас есть два варианта инициализации пользовательских типов.
Совокупные Инициализационные
Агрегаты POD типы и массивы стручки или встроенных типов. Они могут быть инициализированы с помощью списков инициализатора с фигурными скобками:
struct A {
int i;
};
struct B {
A j;
int k;
};
B b = {{1}, 2 };
Это описано более подробно в этом InformIT article.
Как уже отмечалось, это работает только для POD-типов и, таким образом, не работает, когда наследование входит в игру. В этом случае вы должны использовать
Пользовательские конструкторы
Они позволяют довольно свободно инициализировать пользовательские типы, определяя специальные функции-члены:
struct A {
int i;
A(int number) : i(number) {}
};
struct B : A {
int j;
B(int number1, number2) : A(number1), j(number2) {}
};
B b(1, 2);
Конструкторы покрыты более подробно в this InformIT article.