Это прекрасно. Фактически, канонический способ выполнения некоторых операций - это вызов метода базового класса, а затем выполнение любых действий (или наоборот). Я имею в виду operator =
здесь. Конструкторы обычно работают таким же образом, даже если это немного замаскировано в списке инициализации.
Да, все в порядке, если вы не нарушаете принцип замены Лискова.
It's ok. Syntax you had gave can be also used to temporary turn off polymorphism, i.e. when you call obj->B::foo() method will be chosen from class B regardless if foo() is virtual or not and if obj is instance of B or not (it must be an instance of class extending B though).
Я видел, как фреймворки GUI использовали это, чтобы вернуться к реализации по умолчанию базового класса, которая содержала код для сигнализации об ошибках / выдачи исключения / возврата общего значения.
Yes it is , that's what your compiler do for you every time it generates a constructor and a destructor: calling the mother's one for instance. I often rely on that"trick" in my own code.