Страницы

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

воскресенье, 12 января 2020 г.

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

#cpp #классы


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


Ответы

Ответ 1



Да, можно. Но не рекомендуется. При вызове виртуального метода в конструкторе, будет вызвана функция (пере)определенная в этом классе, и одном из его базовых классов, но не в классах потомках, т.к. они еще не сконструированы. В деструкторе происходит то же самое, класс-потомок уже разрушен, и его функции не могут быть вызваны. Поэтому будет вызована функция, определенная в этом классе или его базовых классах. 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.

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

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