Kalıtım Erişim Seviyeleri
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 49 / 104.
Seçtiğiniz kalıtım türü, temel sınıf üyelerine türetilmiş sınıfta nasıl erişileceğini etkiler. C++ üç seçenek sunar: public, protected ve private kalıtım.
Her tür üye erişimini şu şekilde dönüştürür:
| Temel üye | public kalıtım | protected kalıtım | private kalıtım |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | erişilemez | erişilemez | erişilemez |
class Base {
public:
int pub;
protected:
int prot;
private:
int priv;
};
class PublicDerived : public Base {
// pub public'dir, prot protected'dir, priv erişilemezdir
};
class ProtectedDerived : protected Base {
// pub protected'dir, prot protected'dir, priv erişilemezdir
};
class PrivateDerived : private Base {
// pub private'dir, prot private'dir, priv erişilemezdir
};Public kalıtım, "bir türüdür" ilişkilerini modeller ve açık ara en yaygın olanıdır. Bir Dog, bir Animal'dır; bu nedenle dış kod ona bu şekilde davranabilir.
Protected ve private kalıtım, "uygulanarak oluşturulmuş" ilişkilerini modeller. Temel sınıf arayüzünü dışarıdaki koddan gizler; kalıtım ilişkisini açığa çıkarmadan uygulamayı yeniden kullanmak istediğinizde yararlıdır. Private kalıtımda, daha sonra türetilen sınıflar bile özgün temel sınıf üyelerine erişimi kaybeder.
Görev
KolayBasit bir cihaz hiyerarşisi oluşturarak farklı kalıtım türlerinin üye erişilebilirliğini nasıl etkilediğini keşfedelim. Bir temel Device sınıfı ve her biri farklı bir kalıtım türü kullanan üç türetilmiş sınıf oluşturacak, public, protected ve private kalıtımın üye erişimini nasıl dönüştürdüğünü doğrudan göreceksin.
Kodunu iki dosya arasında düzenleyeceksin:
Device.h: Farklı erişim düzeylerinde üç üyeye sahip bir temelDevicesınıfı tanımla:- Bir public
std::string model - Bir protected
int serialNumber - Varsayılan olarak 999 değerine ayarlanmış bir private
int internalCode - Şunu yazdıran bir public
showModel()metodu:Model: <model>
Ardından, her biri farklı bir kalıtım türü kullanarak
Devicesınıfından kalıtım alan üç türetilmiş sınıf oluştur:PublicDevice, public kalıtım kullanarak: şunu yazdıran birdisplaySerial()metodu ekle:Serial: <serialNumber>ProtectedDevice, protected kalıtım kullanarak: şunu yazdıran birdisplaySerial()metodu ekle:Serial: <serialNumber>PrivateDevice, private kalıtım kullanarak: şunu yazdıran birdisplaySerial()metodu ekle:Serial: <serialNumber>
Her türetilmiş sınıf, bir model adı ve seri numarası alan; modeli temel sınıfa aktaran ve seri numarasını ayarlayan bir kurucuya sahip olmalıdır.
- Bir public
main.cpp: İki girdi oku (her biri ayrı bir satırda):- Model adı (string)
- Seri numarası (integer)
Aynı girdi değerleriyle her türetilmiş türden bir nesne oluştur. Ardından erişim farklılıklarını göster:
PublicDeviceiçin:- Nesne üzerinde doğrudan
showModel()çağır (public kalıtım onu public tuttuğu için çalışır) modelöğesine doğrudan eriş ve şunu yazdır:Direct model access: <model>displaySerial()çağır
ProtectedDevicevePrivateDeviceiçin:- Yalnızca
displaySerial()çağır (kalıtılanshowModel()vemodelartık dışarıdan public olarak erişilebilir değildir)
Çıktı biçimi:
--- PublicDevice --- Model: <model> Direct model access: <model> Serial: <serial> --- ProtectedDevice --- Serial: <serial> --- PrivateDevice --- Serial: <serial>
Örneğin, girdiler Laptop ve 12345 olduğunda:
--- PublicDevice ---
Model: Laptop
Direct model access: Laptop
Serial: 12345
--- ProtectedDevice ---
Serial: 12345
--- PrivateDevice ---
Serial: 12345Yalnızca PublicDevice sınıfının kalıtılan public üyelere dışarıdan erişime izin verdiğine dikkat et. Diğer kalıtım türleri temel sınıf arayüzünü dış koddan gizler; ancak türetilmiş sınıflar, kendi metotları aracılığıyla protected üyelere dahili olarak erişmeye devam edebilir.
Kendin dene
#include <iostream>
#include <string>
#include "Device.h"
using namespace std;
int main() {
// Girdiyi oku
string modelName;
int serialNum;
getline(cin, modelName);
cin >> serialNum;
// TODO: Girdi değerleriyle her türetilmiş türden nesneler oluştur
// PublicDevice pubDev(modelName, serialNum);
// ProtectedDevice protDev(modelName, serialNum);
// PrivateDevice privDev(modelName, serialNum);
// TODO: Demonstrate PublicDevice access
cout << "--- PublicDevice ---" << endl;
// - Nesne üzerinde showModel() metodunu doğrudan çağır
// - Access model directly and print: Direct model access: <model>
// - displaySerial() metodunu çağır
// TODO: Demonstrate ProtectedDevice access
cout << "--- ProtectedDevice ---" << endl;
// - Yalnızca displaySerial() metodunu çağır (showModel ve model herkese açık erişilebilir değil)
// TODO: Demonstrate PrivateDevice access
cout << "--- PrivateDevice ---" << endl;
// - Yalnızca displaySerial() metodunu çağır (showModel ve model herkese açık erişilebilir değil)
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic KonteynerKendi başına pratik yap: Online C++ derleyicisi