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