49 / 90

C++ Function Overriding

C++ funksiyani qayta aniqlash

Ma'lumki, inheritance OOP xususiyati bo'lib, u bizga class bazasidan olingan sinflarni yaratish imkonini beradi. Olingan sinflar asosiy sinfning xususiyatlarini meros qilib oladi.

Aytaylik, biz bir xil function ni asosiy sinfda ham, olingan sinfda ham aniqlaymiz. Endi bu funksiyani hosila sinf ob'ekti yordamida chaqirganimizda, hosila sinfning funksiyasi bajariladi.

Bu erda olingan sinfdagi a'zo funksiyasi asosiy sinfdagi a'zo funksiyasini soya qiladi. Bu asosiy sinf a'zosi funksiyasini soya qilish deb ataladi

1-misol: C++ Shadowing Base Class a'zo funksiyasi

example.cpp
// Soyali asosiy sinf a'zolari funksiyasini namoyish qilish uchun C++ dasturi

#include <iostream>
using namespace std;

class Base {
   public:
    void print() {
        cout << "Base Function" << endl;
    }
};

class Derived : public Base {
   public:
    void print() {
        cout << "Derived Function" << endl;
    }
};

int main() {
    Derived derived1;
    derived1.print();
    return 0;
}

Chiqish

kod
Derived Function

Bu erda print() funksiyasi Base va Derived sinflarida ham aniqlanadi.

Shunday qilib, biz Derived obyektidan print() ni derived1 deb chaqirganimizda, Derived dan print() Base funksiyasini soya qilish orqali bajariladi.

Working of function Shadowing in C++

Working of C++ Function Shadowing

Ko'rib turganimizdek, funksiya soyali edi, chunki biz funksiyani Derived sinfining ob'ektidan chaqirdik.

Agar biz print() funksiyasini Base sinfidagi ob'ektdan chaqirganimizda, funksiya soyada qolmagan bo'lardi.

example.cpp
// Base sinfining chaqiruv funksiyasi
Base base1;
base1.print(); // Chiqish: Asosiy funksiya

C++ da Shadowed Funksiyaga kirish

Asosiy sinfning soyali funksiyasiga kirish uchun biz :: diapazonini aniqlash operatoridan foydalanamiz.

Biz, shuningdek, olingan sinf ob'ektiga ishora qilish uchun asosiy sinfning pointer -dan foydalanib, so'ngra ushbu ko'rsatgichdan funksiyani chaqirish orqali soyali funksiyaga kirishimiz mumkin.

2-misol: C++ ga asosiy sinfdan soyali funksiyaga kirish

example.cpp
// Soyali funksiyaga kirish uchun C++ dasturi
// main() da miqyosni aniqlash operatori yordamida ::

#include <iostream>
using namespace std;

class Base {
   public:
    void print() {
        cout << "Base Function" << endl;
    }
};

class Derived : public Base {
   public:
    void print() {
        cout << "Derived Function" << endl;
    }
};

int main() {
    Derived derived1, derived2;
    derived1.print();

    // Base sinning print() funksiyasiga kirish
    derived2.Base::print();

    return 0;
}

Chiqish

kod
Derived Function
Base Function

Mana, operator

example.cpp
derived2.Base::print();

Base sinfining print() funksiyasiga kiradi.

Access Shadowed function using object of derived class in C++

C++ Access Shadowed Function Using Derived Object

3-misol: C++ hosila sinfidan soyali funksiyani chaqirish

example.cpp
// Soyali funksiyani chaqirish uchun C++ dasturi
// olingan sinfning a'zo funksiyasidan

#include <iostream>
using namespace std;

class Base {
   public:
    void print() {
        cout << "Base Function" << endl;
    }
};

class Derived : public Base {
   public:
    void print() {
        cout << "Derived Function" << endl;

        // bekor qilingan funksiyani chaqirish
        Base::print();
    }
};

int main() {
    Derived derived1;
    derived1.print();
    return 0;
}

Chiqish

kod
Derived Function
Base Function

Ushbu dasturda biz Derived sinfining o'zida asosiy sinf a'zosi funksiyasini chaqirdik.

example.cpp
class Derived : public Base {
   public:
    void print() {
        cout << "Derived Function" << endl;
        Base::print();
    }
};

Derived sinfidagi Base sinfidan print() a'zo funksiyasini chaqiradigan Base::print(); kodiga e'tibor bering.

Access overridden function inside derived class in C++

C++ Access Shadowed Function Inside Derived Class

4-misol: Pointer yordamida C++ soyali funksiyani chaqirish

example.cpp
// Pointer yordamida soyali funksiyaga kirish uchun C++ dasturi
// Derived sinfining ob'ektiga ishora qiluvchi asosiy turdagi

#include <iostream>
using namespace std;

class Base {
   public:
    void print() {
        cout << "Base Function" << endl;
    }
};

class Derived : public Base {
   public:
    void print() {
        cout << "Derived Function" << endl;
    }
};

int main() {
    Derived derived1;

    // olingan1 ga ishora qiluvchi Baza tipidagi ko'rsatkich
    Base* ptr = &derived1;

    // ptr yordamida asosiy sinfning chaqiruv funksiyasi
    ptr->print();

    return 0;
}

Chiqish

kod
Base Function

Ushbu dasturda biz ptr nomli Base tipidagi ko'rsatkich yaratdik. Bu ko'rsatkich olingan Derived obyektiga ishora qiladi1.

example.cpp
// olingan1 ga ishora qiluvchi Baza tipidagi ko'rsatkich
Base* ptr = &derived1;

print() funksiyasini ptr yordamida chaqirganimizda, u Base dan a'zo funksiyani chaqiradi.

example.cpp
// ptr yordamida asosiy sinfning chaqiruv funksiyasi
ptr->print();

Buning sababi, ptr Derived ob'ektiga ishora qilsa ham, u aslida Base turiga tegishli. Shunday qilib, u Base a'zo funksiyasini chaqiradi.

Base funksiyasiga kirish o‘rniga uni bekor qilish uchun Base sinfida virtual functions dan foydalanishimiz kerak.