Sobes.tech
Junior

Override дар C++ чист?

sobes.tech AI

Ҷавоб аз AI

Об'ектни устун қилиш (override) — бу об'ектга йўналтирилган дастурлашда, асосий синфда эълон қилинган виртуал функциянинг ўзгача амалга оширилишига таъминловчи механизм. Бундай функция асосий синфга ишоратчи ёки ҳавола орқали чақирилганда, ҳақиқий объект турининг (мерос олган ёки асосий) амалга оширилиши бажарилади, бу функциянинг устун қилинган ёки қилинмаганлигига боғлиқ.

Асосий нуқталар:

  • Фақат виртуал функцияларга қўлланилади.
  • Устун қилувчи функциянинг имзоси (исм, қайтариш тури, параметрлар турлари ва сони) асосий синфдаги устун қилинган функциянинг имзоси билан тўғри мувофқ келиши керак.
  • override калит сўзи (C++11дан бошлаб) функцияни аниқ устун қилиш нииятини кўрсатиш учун ишлатилади. Компилятор, асосий синфда бу имзога эга функция ҳақиқатан ҳам мавжудлигини текширади ва агар мавжуд бўлмаса, хато беради. Бу ёзилишдаги хатолардан қочишга ёрдам беради ва кодни кўпроқ ўқишга қулай қилади.

Масалан:

class Base {
public:
    virtual void print() {
        // Асосий синфнинг амалга оширилиши
        // ...
    }

    virtual void display(int x) const {
        // Янги виртуал функция
        // ...
    }
};

class Derived : public Base {
public:
    // Baseдан print функциясини устун қилади
    void print() override {
        // Derived учун махсус амалга ошириш
        // ...
    }

    // Бу устун қилиш эмас, чунки const йўқ
    /*
    void display(int x) {
        // override билан компиляция хато
        // ...
    }
    */

    // Тўғри устун қилиш
    void display(int x) const override {
        // Derived учун махсус амалга ошириш
        // ...
    }
};