Это из стандарта С++ 11 с 12.7.4. Это довольно запутанно.
- Что означает последнее предложение в тексте?
- Почему последний вызов метода в
B::B
undefined? Shoudn't это просто называтьa.A::f
?
4 Функции-члены, включая виртуальные функции (10.3), можно назвать во время строительства или уничтожения (12.6.2). Когда виртуальная функция вызывается прямо или косвенно из конструктора или из деструктор, в том числе при строительстве или классы нестатические элементы данных и объект, которому вызов применяется объект (назовите его x) под строительство или уничтожение, вызываемая функция является конечным переопределением в конструкторах или класс деструкторов, а не один, переопределяющий его в более производном классе. Если вызов виртуальной функции использует доступ к явным членам класса (5.2.5), а выражение объекта относится к полному объекту x или один из этих подобъектов базового класса, но не x или один из его субобъекты базового класса, поведение undefined. [Пример:
struct V { virtual void f(); virtual void g(); }; struct A : virtual V { virtual void f(); }; struct B : virtual V { virtual void g(); B(V*, A*); }; struct D : A, B { virtual void f(); virtual void g(); D() : B((A*)this, this) { } }; B::B(V* v, A* a) { f(); // calls V::f, not A::f g(); // calls B::g, not D::g v->g(); // v is base of B, the call is well-defined, calls B::g a->f(); // undefined behavior, a’s type not a base of B }
-end пример]