Sobes.tech
Junior — Middle

Класс конструкторунда виртуалдык ыкмаларды чакырудун өзгөчөлүгү эмнеде?

sobes.tech AI

AIден жооп

C++-да бир класс конструкторунун ичинде виртуалдуу методдор чакырылганда, өзгөчөлүк пайда болот: виртуалдуу чакыруулар адаттагыдай иштебейт. Объекттин конструктору ишке ашканда, виртуалдык таблица (vtable) учурдагы класстын методдоруна көрсөтүп турат, мурас алган класстарда кайра жазылгандарга эмес.

Бул дегендик, эгер базалык класстын конструкторунда виртуалдуу метод чакырылса, ал так базалык класстын методу болот, эгер ал мурас алган класста кайра жазылган болсо да. Бул, объекттин дагы ишке киришкен бөлүктөрүнө көз каранды болушу мүмкүн болгон методдорду чакырууну алдын алуу үчүн жасалган.

Мисал:

class Base {
public:
    Base() { foo(); }
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
};

class Derived : public Base {
public:
    Derived() : Base() {}
    void foo() override { std::cout << "Derived::foo" << std::endl; }
};

int main() {
    Derived d; // "Base::foo" чыгат, "Derived::foo" эмес
}

Ошондуктан, виртуалдуу методдорду чакыруу конструкторлордо жана деструкторлордо дайыма учурдагы класстын контекстинде болот, мурас алган класстын эмес.