15. Inheritance — meros olish

Oldingi bobda class va object bilan tanishdik.

C++ da bir classning xususiyatlarini boshqa classga berish mumkin.

Bu inheritance yoki meros olish deb ataladi.


Inheritance nima?

Masalan, bizda Hayvon nomli class bor.

Hayvon:

ism
yosh

kabi xususiyatlarga ega.

Keyin It degan class yaratmoqchimiz.

It ham hayvon bo‘lgani uchun uning ism va yosh xususiyatlari kerak bo‘ladi.

Ularni qaytadan yozish shart emas.

It classi Hayvon classidan meros olishi mumkin.


Oddiy misol

Avval Hayvon classini yaratamiz:

class Hayvon {
public:
    string ism;

    void ovoz() {
        cout << "Hayvon ovoz chiqaryapti.";
    }
};

Keyin It classini yaratamiz:

class It : public Hayvon {
};

Bu yerda:

It

Hayvon classidan meros olmoqda.


Meros olingan xususiyatdan foydalanish

Endi It objectini yaratamiz:

It it1;

Hayvon classidagi ism dan foydalanishimiz mumkin:

it1.ism = "Rex";

Va:

cout << it1.ism;

Natija:

Rex

It classi Hayvon classidan ism xususiyatini meros oldi.


Methodni ham meros olish

Hayvon classida:

void ovoz() {
    cout << "Hayvon ovoz chiqaryapti.";
}

bor edi.

It undan meros olgani uchun:

It it1;

it1.ovoz();

deb yozishimiz mumkin.

Natija:

Hayvon ovoz chiqaryapti.

To‘liq misol

#include <iostream>
#include <string>

using namespace std;

class Hayvon {
public:
    string ism;

    void ovoz() {
        cout << "Hayvon ovoz chiqaryapti.";
    }
};

class It : public Hayvon {
};

int main() {
    It it1;

    it1.ism = "Rex";

    cout << it1.ism << endl;

    it1.ovoz();

    return 0;
}

Natija:

Rex
Hayvon ovoz chiqaryapti.

Yangi xususiyat qo‘shish

Meros oluvchi class o‘zining yangi xususiyatlarini ham qo‘shishi mumkin.

Masalan:

class It : public Hayvon {
public:
    void hurish() {
        cout << "Vov vov!";
    }
};

Endi:

It it1;

it1.ism = "Rex";

it1.ovoz();
it1.hurish();

Natija:

Hayvon ovoz chiqaryapti.
Vov vov!

Bu yerda It:

  • Hayvon dan ism ni oldi;
  • Hayvon dan ovoz() ni oldi;
  • o‘zining hurish() methodiga ega bo‘ldi.

Parent va Child class

Inheritance bilan ishlaganda ikkita muhim atama bor.

Meros beruvchi class:

Parent class yoki Base class

Meros oluvchi class:

Child class yoki Derived class

Masalan:

class Hayvon {
};

class It : public Hayvon {
};

Bu yerda:

Hayvon → Parent class

It → Child class

Yana bir misol

Transport nomli class yaratamiz.

class Transport {
public:
    void yurish() {
        cout << "Transport harakatlanmoqda.";
    }
};

Keyin Mashina undan meros oladi:

class Mashina : public Transport {
};

Endi:

Mashina mashina1;

mashina1.yurish();

Natija:

Transport harakatlanmoqda.

Child class o‘z methodiga ega bo‘lishi mumkin

Masalan:

class Mashina : public Transport {
public:
    void signal() {
        cout << "Bip bip!";
    }
};

Endi:

Mashina mashina1;

mashina1.yurish();
mashina1.signal();

Natija:

Transport harakatlanmoqda.
Bip bip!

Bir nechta child class

Bitta parent classdan bir nechta class meros olishi mumkin.

Masalan:

class Hayvon {
public:
    void nafasOlish() {
        cout << "Nafas olyapti.";
    }
};

Keyin:

class It : public Hayvon {
};

class Mushuk : public Hayvon {
};

Endi It ham, Mushuk ham nafasOlish() methodidan foydalanishi mumkin.


Inheritance qachon ishlatiladi?

Inheritance bir nechta classlarda umumiy xususiyatlar bo‘lganda foydali.

Masalan:

Hayvon
   |
   +-- It
   |
   +-- Mushuk
   |
   +-- Qush

Yoki:

Transport
   |
   +-- Mashina
   |
   +-- Avtobus
   |
   +-- Mototsikl

Umumiy ma'lumotlarni parent classga yozamiz.

Keyin child classlar undan foydalanadi.


Amaliy misol

#include <iostream>

using namespace std;

class Transport {
public:
    void yurish() {
        cout << "Transport yurmoqda." << endl;
    }
};

class Mashina : public Transport {
public:
    void signal() {
        cout << "Bip bip!" << endl;
    }
};

int main() {
    Mashina mashina1;

    mashina1.yurish();
    mashina1.signal();

    return 0;
}

Natija:

Transport yurmoqda.
Bip bip!

Inheritance yozilishi

Inheritance ning asosiy ko‘rinishi:

class Child : public Parent {
};

Masalan:

class It : public Hayvon {
};

Bu:

It Hayvon dan meros oladi

degan ma'noni bildiradi.


Nima uchun inheritance kerak?

Inheritance kodni qayta yozishni kamaytiradi.

Masalan, It, Mushuk va Qush uchun bir xil nafasOlish() methodini alohida yozish shart emas.

Uni Hayvon classiga yozamiz:

class Hayvon {
public:
    void nafasOlish() {
        cout << "Nafas olyapti.";
    }
};

Keyin boshqa classlar undan meros oladi.

Bu dastur kodini tartibli qiladi.


Amaliy mashqlar

1-mashq

Hayvon classini yarating.

Unda:

ovoz()

methodi bo‘lsin.

Keyin It classini Hayvon dan meros oldiring.


2-mashq

Transport classini yarating.

Unda:

yurish()

methodi bo‘lsin.

Keyin Mashina classini undan meros oldiring.


3-mashq

Hayvon classidan:

It
Mushuk

classlarini yarating.

Har birida alohida method bo‘lsin.

Masalan:

hurish()
miyovlash()

4-mashq

Transport classidan:

Mashina
Avtobus
Mototsikl

classlarini yarating.

Ularning har biriga alohida method qo‘shing.


Muhim narsalarni eslab qoling

Inheritance — bir classning xususiyatlarini boshqa classga berish.

Masalan:

class Hayvon {
};

class It : public Hayvon {
};

Bu yerda Hayvon — parent class.

It — child class.

Child class parent classning public xususiyatlari va methodlaridan foydalanishi mumkin.

Child class o‘zining yangi xususiyatlari va methodlarini ham qo‘shishi mumkin.

Inheritance katta dasturlarda classlar orasidagi bog‘lanishni yaratish uchun ishlatiladi.