Страницы

Поиск по вопросам

суббота, 22 июня 2019 г.

Виртуальные методы

Можно ли вызывать виртуальные методы в конструкторах и деструкторах классов?


Ответ

Да, можно. Но не рекомендуется
При вызове виртуального метода в конструкторе, будет вызвана функция (пере)определенная в этом классе, и одном из его базовых классов, но не в классах потомках, т.к. они еще не сконструированы.
В деструкторе происходит то же самое, класс-потомок уже разрушен, и его функции не могут быть вызваны. Поэтому будет вызована функция, определенная в этом классе или его базовых классах.
struct A { virtual void f() = 0; virtual void g() { std::cout << "A::g "; } };
struct B : A { B() { f(); // будет вызвана B::f g(); // будет вызвана A::g } void f() override { std::cout << "B::f "; } };
struct C : B { // не будут вызваны из конструктора B void f() override { std::cout << "C::f "; } void g() override { std::cout << "C::g "; } };
C c; // выведет B::f A::g
Релевантная цитата из стандарта, 12.7 Construction and destruction [class.cdtor] p4
Member functions, including virtual functions (10.3), can be called during construction or destruction [...] If the virtual function call uses an explicit class member access (5.2.5) and the object expression refers to the complete object of x or one of that object’s base class subobjects but not x or one of its base class subobjects, the behavior is undefined.

Комментариев нет:

Отправить комментарий