Avlod sinfiga yangi funksiyalar qo’shish. Yuqoridagi misolda bizda ajdod-sinfi uchun manba kodiga kirish imkonimiz bor, agar xohlasak, to'g'ridan-to'g'ri ajdod-sinfiga yangi funksiya qo'shishimiz mumkin.
Ba'zida ajdod sinfiga kirishimiz mumkin, lekin biz uni o'zgartirishni xohlamaymiz. Masalan, biz faqat uchinchi tomon sotuvchisidan kod kutubxonasini sotib oldik, ammo bizga qo'shimcha funksiyalar kerak. Biz uni kutubxonaning manba kodiga qo'shishimiz mumkin, ammo bu eng yaxshi yechim bo'lmaydi. Yangilanish kelsa nima bo'ladi? Yangilashdan so'ng biz barcha kodni yana qo'lda ko'chirishimiz kerak bo'ladi, bu vaqt talab etadi va qo'shimcha ravishda yangilashdan so'ng bizning eski kodimiz kutubxona kodi bilan ishlamasligi xavfi mavjud.
Ajdod sinfini o'zgartirish mumkin bo'lmagan holatlar ham mavjud. Misol uchun, biz C++ standart kutubxonasining bir qismi bo'lgan kodni o'zgartira olmaymiz. Ammo biz ushbu kutubxonadan sinflarni meros qilib olishimiz va keyin avlod sinflarimizga kerakli funksiyalarni qo'shishimiz mumkin. Xuddi shu narsa bizga sarlavha fayllari taqdim etiladigan uchinchi tomon kutubxonalari uchun ham amal qiladi, lekin kod oldindan kompilyatsiya qilinadi.
Qanday bo'lmasin, eng yaxshi yechim - o'z ajdod sinfingizni yozish va avlod sinflarimizga kerak bo'lgan funksiyalarni qo'shish.
Parent sinfining bir nyuansi shundaki, boshqa obyektlar m_value ga kirishlari mumkin. Biz buni Parent sinfiga kirish funksiyalarini qo'shish orqali tuzatishimiz mumkin, ammo misol uchun, Child sinfiga getter qo'shamiz. m_value Parent sinfida protected deb e'lon qilinganligi sababli, Child unga to'g'ridan-to'g'ri kirish huquqiga ega.
Avlod sinfiga yangi funksiya qo'shish odatdagidek amalga oshiriladi:
class Child: public Parent
{
public:
Child(int value)
: Parent(value)
{
}
int getValue() { return m_value; }
};
Endi tashqaridan boshqa obyektlar m_value ga kirish uchun Child sinfining obyekti orqali getValue () ga murojaat qilishlari mumkin bo'ladi:
int main()
{
Child child(7);
cout<<"Avlod "<return 0;
}
Ko'rinib turibdiki, Parent sinfi obyektlari Child sinfida getValue () metodiga kirish huquqiga ega emas. Quyidagilar ishlamaydi:
int main()
{
Parent parent(7);
cout <<"Parent" << parent.getValue() << " qiymatiga ega"<return 0;
}
Buning sababi, Parent sinfida getValue () metodi mavjud emas. getValue () metodi Child sinfiga tegishli. Avlod ajdodning merosxo’ri bo'lgani uchun, avlod ajdod a'zolariga kirish huquqiga ega, Ajdod esa avlod sinfidagi hech narsadan foydalana olmaydi.
1-misol.
#include
#include
class Person
{
public:
Person(std::string n, int a)
{
name = n; age = a;
}
void display()
{
std::cout << "Name: " << name << "\tAge: " << age << std::endl;
}
protected:
std::string name;
private:
int age;
};
class Employee : public Person
{
public:
Employee(std::string n, int a, std::string c):Person(n, a)
{
company = c;
}
void showEmployeeName()
{
std::cout << "Employee Name: " << name << std::endl;
}
private:
std::string company;
};
int main()
{
Person tom("Tom", 23);
// tom.name = "Tommy"; ошибка
Employee bob("Bob", 31, "Microsoft");
// bob.name = "Bob Tompson"; ошибка
bob.showEmployeeName();
return 0;
}
Do'stlaringiz bilan baham: |