C Gömülü Programlama konularımız yayında...
Kalıtım nesneye yönelik programlamanın en önemli özelliklerinden biridir. Kalıtım bir nesneden türetilen bir nesnenin türetildiği nesnenin tüm özelliklerine sahip olmasıdır.
Kalıtım, nesneye yönelik programlamada mevcut bir sınıf içinde bulunan veri ve metotların bu sınıftan türetilen alt sınıflar içinde kullanılması olarak tanımlanabilir.
Kendisinden türetme yapılan sınıf ana, ebeveyn veya süper sınıf olarak, türetilen sınıflar ise çocuk, alt veya uzantı sınıf olarak isimlendirilir.
Bir ana sınıftan bir sınıf türetildiğinde, ana sınıfta yer alan tüm veri ve metotlar türetilen sınıf tarafından kullanılabileceği gibi, türetilen sınıf içinde de yeni veri ve metotlar tanımlanabilir. Eğer ihtiyaç duyulursa, ana sınıftan devralınan metotlar yeniden tanımlanır (overriding) ve aynı isim altında farklı kodlar yazılır.
Ana sınıftan bir alt sınıf türeterek, ana sınıfta yer alan veri ve metotların devralınması, devralınan metotlar için yeniden kod yazmaya gerek duymadan, ana sınıf içinde yer alan veri ve metotları kullanmaya olanak sağlar.
Öncelikle bir ana sınıf tanımlaması yapılmalıdır. Ana sınıf tanımlaması yapılırken, bu sınıftan üretilecek olan sınıfların ortak olarak sahip olacağı ve birlikte kullanacağı özellikleri gösteren değişkenlerin tamamının bildirimi ana sınıf içinde yapılmalıdır. Ana sınıftan türetilen alt sınıfların sadece kendileri tarafından kullanılacak özellikleri gösteren değişkenlerin bildirimi ise türetilen alt sınıfların içinde yapılmalıdır.
Ana sınıftan türetilen alt sınıflardan da alt sınıflar türetilerek çoklu kalıtım özelliği kullanılabilir.
Bir sınıf ana sınıf olarak kabul edilerek bu sınıftan bir sınıf türetildiğinde, ana sınıf içinde yer alan tüm elemanlar (değişken ve fonksiyonlar) türetilen sınıfın üyesi haline gelir. C++ dilinde, bu işlemi gerçekleştirmek için aşağıda gösterilen genel yapı kullanılır:
class türetilen-sınıf : erişim-türü ana-sınıf { // Türetilen sınıf içeriği }
Türetilen sınıf içinden ana sınıf elemanlarına erişim durumu erişim-türü değeri ile belirlenir.
erişim-türü ifadesinin kullanımı isteğe bağlıdır. Kullanıldığında, aşağıdaki değerlerden birini almalıdır:
private:
protected:
public:
Eğer ana sınıftan bir alt sınıf türetilirken, erişim-türü ifadesi kullanılmazsa, bu değer ön tanımlı olarak private olacaktır.
Ana sınıf elemanlarına erişim koşulları
Ana sınıf elemanlarına kendi içinden, türetilmiş sınıftan ve sınıflar dışında kalan program kodlarından erişim yetkisini gösteren tablo aşağıdadır.
Kalıtım türüne göre ana sınıf elemanlarının türetilen sınıf içindeki durumu
Kalıtım türüne göre ana sınıf elemanlarının türetilen sınıf içindeki durumunu gösteren tablo aşağıdadır:
Bir ana sınıftan public olarak bir sınıf türetildiğinde, ana sınıfın tüm public elemanları türetilmiş sınıfın public elemanı ve ana sınıfın tüm protected elemanları türetilmiş sınıfın protected elemanı haline gelir. Ana sınıfın private elemanları ise, ana sınıfa özel kalır ve türetilmiş sınıfın elemanları tarafından erişilemez.
Public kalıtım işleminde, ana sınıfın tüm public elemanlarının türetilen sınıfın public elemanları olarak işlem göreceğini ve tıpkı türetilen sınıf içinde tanımlanmış değişkenler gibi, türetilen sınıf içinde yer alan üye fonksiyonlar tarafından erişim sağlanabileceğini gösterir. Bu durumda, ana sınıfın tüm protected elemanları türetilen sınıfın protected elemanları olarak işlem görecektir. Ancak, türetilen sınıf içinde yer alan üye fonksiyonlar ana sınıfın private elemanlarına direk olarak erişim sağlayamazlar.
C++'da, bir sınıf elemanı protected olarak tanımlandığında, bu elemana sınıfın diğer elemanlarının yanısıra, bu sınıftan türetilen sınıfın elemanları da erişebilir. Başka bir ifade ile; bir sınıf içinde protected olarak tanımlanmış elemanlara sadece bu sınıftan türetilmiş sınıflar erişim sağlayabilir. Bu özellik, private ve protected olarak tanınmlanmış elemanların farkını göstermektedir.
Şimdi, bir ana sınıftan public olarak türetilen bir sınıf ve her iki sınıfa ait nesnelerle yapılan işlemleri bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
class sinifana {
private:
// Bu değişkene sadece sinifana içindeki fonksiyonlar erişim sağlayabilir.
int priidana;
protected:
// Bu değişkene sinifana içindeki fonksiyonlar ile sinifana sınıfından türetilmiş sınıf fonksiyonları erişim sağlayabilir.
int proidana;
public:
// Bu değişkene sinifana içindeki fonksiyonlar ve sinifana sınıfından türetilmiş sınıf fonksiyonları ile
// sinifana türünden ve türetilmiş sınıf türünden oluşturulmuş nesneler doğrudan erişim sağlayabilir.
int pubidana;
void deger_ata(int pid1, int pid2, int pid3)
{
priidana = pid1; proidana = pid2; pubidana = pid3;
cout << "sinifana değişkenlerine değer atama: " << priidana << " " << proidana << " " << pubidana << endl;
}
void deger_goster()
{
cout << "sinifana değişken değerleri: " << priidana << " " << proidana << " " << pubidana << endl;
}
};
class siniftur : public sinifana {
private:
int priidtur;
protected:
int proidtur;
public:
int pubidtur;
// Türetilen sınıf içindeki fonksiyonlar direk olarak
// ana sınıfın public ve protected değişkenlerine erişim sağlayabilir.
void deger_ata_tur(int pid1, int pid2)
{
priidtur = proidana + pubidana; proidtur = pid1; pubidtur = pid2;
cout << "siniftur değişkenlerine değer atama: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
void deger_goster_tur() { cout << "siniftur değişken değerleri: " << priidtur << " " << proidtur << " " << pubidtur << endl; }
};
int main(void)
{
sinifana nes_ana;
cout << "nes_ana değişkeninin sinifana elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------" << endl;
nes_ana.deger_ata(7, 21, 165);
nes_ana.deger_goster();
// nes_ana.priidana = 954; // Derleme hatası verir (Nesne sınıf içindeki private değişkene doğrudan erişim sağlayamaz).
// nes_ana.proidana = 954; // Derleme hatası verir (Nesne sınıf içindeki protected değişkene doğrudan erişim sağlayamaz).
nes_ana.pubidana = 954; // Nesne sınıf içindeki public değişkene doğrudan erişim sağlar.
nes_ana.deger_goster();
siniftur nes_tur;
cout << endl << "nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi:" << endl;
cout << "------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, sinifana sınıfı fonksiyonları yoluyla
// sinifana sınıfı değişkenlerine değer atar ve ekrana yazar.
nes_tur.deger_ata(8, 25, 246);
nes_tur.deger_goster();
// nes_tur.priidana = 741; // Derleme hatası verir (Türetilen sınıf nesnesi ana sınıf içindeki private değişkene doğrudan erişim sağlayamaz).
// nes_tur.proidana = 741; // Derleme hatası verir (Türetilen sınıf nesnesi ana sınıf içindeki protected değişkene doğrudan erişim sağlayamaz).
nes_tur.pubidana = 741; // siniftur sınıfından oluşturulan nes_tur nesnesi ana sınıf içindeki public değişkene doğrudan erişim sağlar.
nes_tur.deger_goster();
cout << endl << "nes_tur değişkeninin sinifana ve siniftur elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, kendi fonksiyonları yoluyla sinifana sınıfının
// protected ve public değişkenlerine erişim sağlayarak kendi değişkenlerine değer atar ve ekrana yazar.
nes_tur.deger_ata_tur(12, 34);
nes_tur.deger_goster_tur();
nes_tur.pubidtur = 687;
nes_tur.deger_goster_tur();
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
nes_ana değişkeninin sinifana elemanlarına erişimi: --------------------------------------------------- sinifana değişkenlerine değer atama: 7 21 165 sinifana değişken değerleri: 7 21 165 sinifana değişken değerleri: 7 21 954 nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi: ------------------------------------------------------------ sinifana değişkenlerine değer atama: 8 25 246 sinifana değişken değerleri: 8 25 246 sinifana değişken değerleri: 8 25 741 nes_tur değişkeninin sinifana ve siniftur elemanlarına erişimi: --------------------------------------------------------------- siniftur değişkenlerine değer atama: 766 12 34 siniftur değişken değerleri: 766 12 34 siniftur değişken değerleri: 766 12 687
Program, sinifana adlı bir sınıf ve bu sınıftan public olarak türetilen siniftur adlı bir sınıf oluşturur. Her iki sınıf içinde de private, protected ve public olmak üzere üç adet değişken ve bu değişkenlere değer atayan ve ekranda gösteren iki adet fonksiyon tanımlar.
Program çalışmaya başladığında, sinifana cinsinden bir nesne tanımlar. Ana sınıf nesnesi yoluyla, ana sınıf fonksiyonlarını çağırarak, önce ana sınıf içindeki değişkenlere birer değer atar sonra değişken değerlerini ekrana yazar. Ana sınıf nesnesini kullanarak doğrudan ana sınıf içinde public pubidana değişkenine bir değer atar ve ana sınıf içindeki deger_goster() fonksiyonu ile değişken değerlerini tekrar ekrana yazar.
Program, ikinci safhada türetilmiş sınıf olan siniftur türünden nes_tur adlı bir nesne oluşturur. Bu nesne yoluyla ana sınıf içindeki fonksiyonlara erişim sağlayarak, önce ana sınıf içindeki değişkenlere birer değer atar sonra değişken değerlerini ekrana yazar. Aynı nesne ile doğrudan ana sınıf içinde public pubidana değişkenine bir değer atar ve ana sınıf içindeki deger_goster() fonksiyonu ile değişken değerlerini tekrar ekrana yazar.
Sonra, aynı nesne ile, türetilen sınıf içindeki deger_ata_tur() fonksiyonu ile sinifana sınıfının protected ve public değişkenlerine erişim sağlayarak, bu değişkenlerin toplamını, priidtur değişkenine atar. Aynı fonksiyon ile proidtur ve pubidtur değişkenlerine de birer değer atar. Türetilmiş siniftur sınıfı içindeki değişken değerlerini ekrana yazar. Aynı nesne ile doğrudan pubidtur değişkenine bir değer atar ve deger_goster_tur() fonksiyonu ile değişken değerlerini tekrar ekrana yazar.
Programda oluşturulan sınıfların içindeki elemanlar ile bu sınıflardan oluşturulan nesnelerin erişim durumlarını gösteren şema aşağıdadır:
Bir ana sınıftan public olarak türetilen bir sınıftan yine public olarak diğer bir sınıf türetildiğinde, ikinci türetilen sınıf elemanları ile bu sınıftan oluşturulan nesnelerin ana sınıf ile ana sınıftan ilk türetilen sınıfın elemanlarına erişim durumunu bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
class sinifana {
private:
// Bu değişkene sadece sinifana içindeki fonksiyonlar erişim sağlayabilir.
int priidana;
protected:
// Bu değişkene sinifana içindeki fonksiyonlar ile sinifana sınıfından türetilmiş sınıf fonksiyonları erişim sağlayabilir.
int proidana;
public:
// Bu değişkene sinifana içindeki fonksiyonlar ve sinifana sınıfından türetilmiş sınıf fonksiyonları ile
// sinifana türünden ve türetilmiş sınıf türünden oluşturulmuş nesneler doğrudan erişim sağlayabilir.
int pubidana;
void deger_ata(int pid1, int pid2, int pid3)
{
priidana = pid1; proidana = pid2; pubidana = pid3;
cout << "sinifana değişkenlerine değer atama: " << priidana << " " << proidana << " " << pubidana << endl;
}
void deger_goster()
{
cout << "sinifana değişken değerleri: " << priidana << " " << proidana << " " << pubidana << endl;
}
};
class siniftur : public sinifana {
private:
int priidtur;
protected:
int proidtur;
public:
int pubidtur;
// Türetilen sınıf içindeki fonksiyonlar direk olarak
// ana sınıfın public ve protected değişkenlerine erişim sağlayabilir.
void deger_ata_tur(int pid1, int pid2)
{
priidtur = proidana + pubidana; proidtur = pid1; pubidtur = pid2;
cout << "siniftur değişkenlerine değer atama: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
void deger_goster_tur() { cout << "siniftur değişken değerleri: " << priidtur << " " << proidtur << " " << pubidtur << endl; }
};
class sinifturtur : public siniftur {
private:
int priidturtur;
protected:
int proidturtur;
public:
int pubidturtur;
// Türetilen sınıftan türetilen sınıf içindeki fonksiyonlar direk olarak
// ana sınıfın public ve protected değişkenlerine erişim sağlayabilir.
void deger_ata_turtur(void)
{
priidturtur = proidana + pubidana; proidturtur = proidtur*2; pubidturtur = pubidtur*2;
cout << "sinifturtur değişkenlerine değer atama: " << priidturtur << " " << proidturtur << " " << pubidturtur << endl;
}
void deger_goster_turtur() { cout << "sinifturtur değişken değerleri: " << priidturtur << " " << proidturtur << " " << pubidturtur << endl; }
};
int main(void)
{
sinifturtur nes_turtur;
// sinifturtur sınıfından oluşturulan nesne, sinifana sınıfı fonksiyonları yoluyla
// sinifana sınıfı değişkenlerine değer atar ve ekrana yazar.
cout << "nes_turtur değişkeninin sinifana elemanlarına erişimi:" << endl;
cout << "------------------------------------------------------" << endl;
nes_turtur.deger_ata(78, 121, 375);
nes_turtur.deger_goster();
nes_turtur.pubidana = 1765; // İkinci türetilen sınıf nesnesi ana sınıf içindeki public değişkene doğrudan erişim sağlar.
nes_turtur.deger_goster(); // sinifana fonksiyonuna erişim
// sinifturtur sınıfından oluşturulan nesne, siniftur sınıfı fonksiyonları yoluyla
// sinifana ve sinifturtur sınıflarının protected ve public değişkenlerine erişim
// sağlayarak siniftur sınıfı değişkenlerine değer atar ve ekrana yazar.
cout << endl << "nes_turtur değişkeninin siniftur elemanlarına erişimi:" << endl;
cout << "------------------------------------------------------" << endl;
nes_turtur.deger_ata_tur(82, 217);
nes_turtur.deger_goster_tur();
nes_turtur.pubidtur = 4257; // İkinci türetilen sınıf nesnesi ilk türetilen sınıf içindeki public değişkene doğrudan erişim sağlar.
nes_turtur.deger_goster_tur(); // İkinci türetilen sınıf fonksiyonuna erişim
// sinifturtur sınıfından oluşturulan nesne, kendi fonksiyonları yoluyla sinifana ve sinifturtur sınıflarının
// protected ve public değişkenlerine erişim sağlayarak kendi değişkenlerine değer atar ve ekrana yazar.
cout << endl << "nes_turtur değişkeninin sinifturtur elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------------" << endl;
nes_turtur.deger_ata_turtur();
nes_turtur.deger_goster_turtur();
nes_turtur.pubidturtur = 6321; // İkinci türetilen sınıf nesnesi kendi içindeki public değişkene doğrudan erişim sağlar.
nes_turtur.deger_goster_turtur();
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
nes_turtur değişkeninin sinifana elemanlarına erişimi: ------------------------------------------------------ sinifana değişkenlerine değer atama: 78 121 375 sinifana değişken değerleri: 78 121 375 sinifana değişken değerleri: 78 121 1765 nes_turtur değişkeninin siniftur elemanlarına erişimi: ------------------------------------------------------ siniftur değişkenlerine değer atama: 1886 82 217 siniftur değişken değerleri: 1886 82 217 siniftur değişken değerleri: 1886 82 4257 nes_turtur değişkeninin sinifturtur elemanlarına erişimi: --------------------------------------------------------- sinifturtur değişkenlerine değer atama: 1886 164 8514 sinifturtur değişken değerleri: 1886 164 8514 sinifturtur değişken değerleri: 1886 164 6321
Program, sinifana adlı bir sınıf ve bu sınıftan public olarak türetilen siniftur adlı bir sınıf ve siniftur sınıfından yine public olarak türetilen sinifturtur adlı bir sınıf oluşturur. Her üç sınıf içinde de private, protected ve public olmak üzere üç adet değişken ve bu değişkenlere değer atayan ve ekranda gösteren iki adet fonksiyon tanımlar.
Program çalışmaya başladığında, sinifturtur sınıfı türünden nes_turtur adlı bir nesne oluşturur. Bu nesne yoluyla ana sınıf içindeki fonksiyonlara erişim sağlayarak, önce ana sınıf içindeki değişkenlere birer değer atar sonra değişken değerlerini ekrana yazar. Aynı nesne ile doğrudan ana sınıf içinde public pubidana değişkenine bir değer atar ve ana sınıf içindeki deger_goster() fonksiyonu ile değişken değerlerini tekrar ekrana yazar.
Sonra, aynı nesne ile, ilk türetilen sınıf içindeki deger_ata_tur() fonksiyonu ile sinifana sınıfının protected ve public değişkenlerine erişim sağlayarak, bu değişkenlerin toplamını, priidtur değişkenine atar. Aynı fonksiyon ile proidtur ve pubidtur değişkenlerine de birer değer atar. Son olarak, siniftur sınıfı içindeki değişken değerlerini ekrana yazar.
Daha sonra, aynı nesne ile, kendi sınıfı içindeki deger_ata_turtur() fonksiyonu ile sinifana ve siniftur sınıflarının protected ve public değişkenlerine erişim sağlayarak, ana sınıf değişkenlerinin toplamını priidturtur değişkenine, siniftur içindeki poridtur değişkeninin iki katını proidturtur değişkenine ve pubidtur değişkeninin iki katını pubidturtur değişkenine atar. Son olarak, sinifturtur sınıfı içindeki değişken değerlerini ekrana yazar.
Programda oluşturulan sınıfların içindeki elemanlar ile bu sınıflardan oluşturulan nesnelerin erişim durumlarını gösteren şema aşağıdadır:
Bir ana sınıftan private erişim türü kullanılarak bir sınıf türetildiğinde, ana sınıfın tüm public ve protected elemanları türetilen sınıfın private elemanları olarak işlem görür.
Private kalıtım ile türetilen bir sınıftan oluşturulan nesneler, doğrudan veya ana sınıf içinde bulunan public fonksiyonları kullanarak ana sınıf protected ve public değişkenlerine erişim sağlayamazlar. Ana sınıf protected ve public değişkenlerine erişim sağlamak için sadece kendi fonksiyonlarını kullanabilirler.
Private olarak türetilmiş sınıfa ait nesneler ana sınıfın hiçbir elemanına doğrudan erişemezler.
Bir ana sınıftan diğer bir sınıf türetildiğinde private değeri kullanılırsa, türetilen sınıftan oluşturulan nesneler, ana sınıf içinde bulunan public fonksiyonları kullanarak da olsa, ana sınıf public değişkenlerine erişim sağlayamazlar.
#include <iostream>
using namespace std;
class sinifana {
private:
// Bu değişkene sadece sinifana içindeki fonksiyonlar erişim sağlayabilir.
int priidana;
protected:
// Bu değişkene sinifana ve siniftur içindeki fonksiyonlar erişim sağlayabilir.
int proidana;
public:
// Bu değişkene sinifana içindeki fonksiyonlar ve sinifana türünden oluşturulmuş nesneler ile
// siniftur içindeki fonksiyonlar doğrudan erişim sağlayabilir.
int pubidana;
void deger_ata(int pid1, int pid2, int pid3)
{
priidana = pid1; proidana = pid2; pubidana = pid3;
cout << "sinifana değişkenlerine değer atama: " << priidana << " " << proidana << " " << pubidana << endl;
}
void deger_goster() { cout << "sinifana değişken değerleri: " << priidana << " " << proidana << " " << pubidana << endl; }
};
class siniftur : private sinifana {
private:
int priidtur;
protected:
int proidtur;
public:
int pubidtur;
// Türetilen sınıf içindeki fonksiyonlar direk olarak
// sadece türetilen sınıf değişkenlerine erişim sağlayabilir.
void deger_ata_tur(int pid1, int pid2, int pid3, int pid4, int pid5)
{
proidana = pid1; pubidana = pid2; // Ana sınıf değişkenlerine değer atama
priidtur = pid3; proidtur = pid4; pubidtur = pid5; // Türetilen sınıf değişkenlerine değer atama
cout << "sinifana değişkenlerine değer atama: " << proidana << " " << pubidana << endl;
cout << "siniftur değişkenlerine değer atama: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
void deger_goster_tur()
{
cout << "sinifana değişken değerleri: " << proidana << " " << pubidana << " " << endl;
cout << "siniftur değişken değerleri: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
};
int main(void)
{
sinifana nes_ana;
cout << "nes_ana değişkeninin sinifana elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------" << endl;
nes_ana.deger_ata(7, 21, 165);
nes_ana.deger_goster();
// nes_ana.priidana = 954; // Derleme hatası verir (Nesne sınıf içindeki private değişkene doğrudan erişim sağlayamaz).
// nes_ana.proidana = 954; // Derleme hatası verir (Nesne sınıf içindeki protected değişkene doğrudan erişim sağlayamaz).
nes_ana.pubidana = 954; // Nesne sınıf içindeki public değişkene doğrudan erişim sağlar.
nes_ana.deger_goster();
siniftur nes_tur;
cout << endl << "nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi:" << endl;
cout << "------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, sinifana sınıfı fonksiyonları yoluyla
// sinifana sınıfı değişkenlerine değer atayamaz ve ekrana yazamaz.
// nes_tur.deger_ata(8, 25, 246); // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
// nes_tur.deger_goster(); // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
// Türetilen sınıf nesnesi ana sınıf içindeki private ve protected değişkenlere doğrudan erişim sağlayamaz.
// nes_tur.priidana = 741; // public ve private kalıtımda derleme hatası verir.
// nes_tur.proidana = 741; // public ve private kalıtımda derleme hatası verir.
// nes_tur.pubidana = 741; // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
// nes_tur.deger_goster(); // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
cout << endl << "nes_tur değişkeninin sınıfana ve siniftur elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, kendi fonksiyonları yoluyla
// sinifana ve siniftur içindeki protected ve public değişkenlere değer atar ve ekrana yazar.
nes_tur.deger_ata_tur(9, 16, 4, 17, 28); // İlk iki parametre anasinif değişken değerleri için değer atar.
nes_tur.deger_goster_tur();
nes_tur.pubidtur = 687;
nes_tur.deger_goster_tur();
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
nes_ana değişkeninin sinifana elemanlarına erişimi: --------------------------------------------------- sinifana değişkenlerine değer atama: 7 21 165 sinifana değişken değerleri: 7 21 165 sinifana değişken değerleri: 7 21 954 nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi: ------------------------------------------------------------ nes_tur değişkeninin sınıfana ve siniftur elemanlarına erişimi: --------------------------------------------------------------- sinifana değişkenlerine değer atama: 9 16 siniftur değişkenlerine değer atama: 4 17 28 sinifana değişken değerleri: 9 16 siniftur değişken değerleri: 4 17 28 sinifana değişken değerleri: 9 16 siniftur değişken değerleri: 4 17 687
Program, sinifana adlı bir sınıf ve bu sınıftan private olarak türetilen siniftur adlı bir sınıf oluşturur. Her iki sınıf içinde de private, protected ve public olmak üzere üç adet değişken ve bu değişkenlere değer atayan ve ekranda gösteren iki adet fonksiyon tanımlar.
Program çalışmaya başladığında, sinifana cinsinden bir nesne tanımlar. Ana sınıf nesnesi yoluyla, ana sınıf fonksiyonlarını çağırarak, önce ana sınıf içindeki değişkenlere birer değer atar sonra değişken değerlerini ekrana yazar. Ana sınıf nesnesini kullanarak doğrudan ana sınıf içinde public pubidana değişkenine bir değer atar ve ana sınıf içindeki deger_goster() fonksiyonu ile değişken değerlerini tekrar ekrana yazar.
Program, ikinci safhada türetilmiş sınıf olan siniftur türünden nes_tur adlı bir nesne oluşturur. Bu nesne yoluyla ana sınıf içindeki fonksiyonlara erişim sağlayamaz.
Sonra, aynı nesne ile, türetilen sınıf içindeki deger_ata_tur() fonksiyonu ile sinifana içindeki proidana ve pubidana değişkenleri ile siniftur içindeki priidtur, proidtur ve pubidtur değişkenlerine birer değer atar. Son olarak, sinifana içindeki proidana ve pubidana değişkenler ile siniftur içindeki değişken değerlerini ekrana yazar.
Bir sınıftan public kalıtım ile bir sınıf türetildiğinde, türetilmiş sınıftan oluşturulan bir nesne ile ana sınıfın protected ve public değişkenlerine erişim sağlanırken, kalıtım private olarak yapıldığında, ana sınıfın protected ve public değişkenlerine türetilen sınıfın fonksiyonlarından erişim sağlanmaktadır.
Bir ana sınıftan private olarak türetilen bir sınıftan public olarak diğer bir sınıf türetildiğinde, ana sınıfın bütün elemanları ilk türetilen sınıfın private elemanı haline geldiğinden, türetilen sınıftan türetilen sınıf ana sınıfın elemanlarına erişim sağlayamaz.
Bu özelliği bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
class sinifana {
private:
// Bu değişkene sadece sinifana içindeki fonksiyonlar erişim sağlayabilir.
int priidana;
protected:
// Bu değişkene sinifana ve siniftur içindeki fonksiyonlar erişim sağlayabilir.
int proidana;
public:
// Bu değişkene sinifana içindeki fonksiyonlar ve sinifana türünden oluşturulmuş nesneler ile
// siniftur içindeki fonksiyonlar doğrudan erişim sağlayabilir.
int pubidana;
void deger_ata(int pid1, int pid2, int pid3)
{
priidana = pid1; proidana = pid2; pubidana = pid3;
cout << "sinifana değişkenlerine değer atama: " << priidana << " " << proidana << " " << pubidana << endl;
}
void deger_goster() { cout << "sinifana değişken değerleri: " << priidana << " " << proidana << " " << pubidana << endl; }
};
class siniftur : private sinifana {
private:
int priidtur;
protected:
int proidtur;
public:
int pubidtur;
// Türetilen sınıf içindeki fonksiyonlar direk olarak
// sadece türetilen sınıf değişkenlerine erişim sağlayabilir.
void deger_ata_tur(int pid1, int pid2, int pid3, int pid4, int pid5)
{
proidana = pid1; pubidana = pid2; // Ana sınıf değişkenlerine değer atama
priidtur = pid3; proidtur = pid4; pubidtur = pid5; // Türetilen sınıf değişkenlerine değer atama
cout << "sinifana değişkenlerine değer atama: " << proidana << " " << pubidana << endl;
cout << "siniftur değişkenlerine değer atama: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
void deger_goster_tur()
{
cout << "sinifana değişken değerleri: " << proidana << " " << pubidana << " " << endl;
cout << "siniftur değişken değerleri: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
};
class sinifturtur : public siniftur {
private:
int priidturtur;
protected:
int proidturtur;
public:
int pubidturtur;
// Türetilen sınıftan türetilen sınıf içindeki fonksiyonlar direk olarak
// ana sınıfın public ve protected değişkenlerine erişim sağlayabilir.
void deger_ata_turtur(void)
{
priidturtur = proidtur; proidturtur = proidtur*2; pubidturtur = pubidtur*2;
cout << "sinifturtur değişkenlerine değer atama: " << priidturtur << " " << proidturtur << " " << pubidturtur << endl;
}
void deger_goster_turtur() { cout << "sinifturtur değişken değerleri: " << priidturtur << " " << proidturtur << " " << pubidturtur << endl; }
};
int main(void)
{
siniftur nes_tur;
cout << "nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi:" << endl;
cout << "------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, sinifana sınıfı fonksiyonları yoluyla
// sinifana sınıfı değişkenlerine değer atayamaz ve ekrana yazamaz.
// nes_tur.deger_ata(8, 25, 246); // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
// nes_tur.deger_goster(); // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
// Türetilen sınıf nesnesi ana sınıf içindeki private ve protected değişkenlere doğrudan erişim sağlayamaz.
// nes_tur.priidana = 741; // public ve private kalıtımda derleme hatası verir.
// nes_tur.proidana = 741; // public ve private kalıtımda derleme hatası verir.
// nes_tur.pubidana = 741; // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
// nes_tur.deger_goster(); // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
cout << endl << "nes_tur değişkeninin sınıfana ve siniftur elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, kendi fonksiyonları yoluyla
// sinifana ve siniftur içindeki protected ve public değişkenlere değer atar ve ekrana yazar.
nes_tur.deger_ata_tur(9, 16, 4, 17, 28); // İlk iki parametre anasinif değişken değerleri için değer atar.
nes_tur.deger_goster_tur();
nes_tur.pubidtur = 687;
nes_tur.deger_goster_tur();
sinifturtur nes_turtur;
// sinifturtur sınıfından oluşturulan nesne, sinifana sınıfı fonksiyonları yoluyla
// sinifana sınıfı değişkenlerine atayamaz ve ekrana yazamaz.
cout << endl << "nes_turtur değişkeninin sinifana elemanlarına erişimi:" << endl;
cout << "------------------------------------------------------" << endl;
// nes_turtur.deger_ata(78, 121, 375); // Derleme hatası verir.
// nes_turtur.deger_goster(); // Derleme hatası verir.
// nes_turtur.pubidana = 1765; // Derleme hatası verir.
// nes_turtur.deger_goster(); // Derleme hatası verir.
// sinifturtur sınıfından oluşturulan nesne, siniftur sınıfı fonksiyonları yoluyla
// sinifana ve sinifturtur sınıflarının protected ve public değişkenlerine erişim
// sağlayarak siniftur sınıfı değişkenlerine değer atar ve ekrana yazar.
cout << endl << "nes_turtur değişkeninin siniftur elemanlarına erişimi:" << endl;
cout << "------------------------------------------------------" << endl;
nes_turtur.deger_ata_tur(7, 19, 5, 21, 37);
nes_turtur.deger_goster_tur();
nes_turtur.pubidtur = 3754; // İkinci türetilen sınıf nesnesi ilk türetilen sınıf içindeki public değişkene doğrudan erişim sağlar.
nes_turtur.deger_goster_tur(); // İkinci türetilen sınıf fonksiyonuna erişim
// sinifturtur sınıfından oluşturulan nesne, kendi fonksiyonları yoluyla sinifturtur sınıfının
// protected ve public değişkenlerine erişim sağlayarak kendi değişkenlerine değer atar ve ekrana yazar.
cout << endl << "nes_turtur değişkeninin sinifturtur elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------------" << endl;
nes_turtur.deger_ata_turtur();
nes_turtur.deger_goster_turtur();
nes_turtur.pubidturtur = 9284; // İkinci türetilen sınıf nesnesi kendi içindeki public değişkene doğrudan erişim sağlar.
nes_turtur.deger_goster_turtur();
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi: ------------------------------------------------------------ nes_tur değişkeninin sınıfana ve siniftur elemanlarına erişimi: --------------------------------------------------------------- sinifana değişkenlerine değer atama: 9 16 siniftur değişkenlerine değer atama: 4 17 28 sinifana değişken değerleri: 9 16 siniftur değişken değerleri: 4 17 28 sinifana değişken değerleri: 9 16 siniftur değişken değerleri: 4 17 687 nes_turtur değişkeninin sinifana elemanlarına erişimi: ------------------------------------------------------ nes_turtur değişkeninin siniftur elemanlarına erişimi: ------------------------------------------------------ sinifana değişkenlerine değer atama: 7 19 siniftur değişkenlerine değer atama: 5 21 37 sinifana değişken değerleri: 7 19 siniftur değişken değerleri: 5 21 37 sinifana değişken değerleri: 7 19 siniftur değişken değerleri: 5 21 3754 nes_turtur değişkeninin sinifturtur elemanlarına erişimi: --------------------------------------------------------- sinifturtur değişkenlerine değer atama: 21 42 7508 sinifturtur değişken değerleri: 21 42 7508 sinifturtur değişken değerleri: 21 42 9284
Program, sinifana adlı bir sınıf ve bu sınıftan private olarak türetilen siniftur adlı bir sınıf ve siniftur sınıfından public olarak türetilen sinifturtur adlı bir sınıf oluşturur. Her üç sınıf içinde de private, protected ve public olmak üzere üç adet değişken ve bu değişkenlere değer atayan ve ekranda gösteren iki adet fonksiyon tanımlar.
Program çalışmaya başladığında, siniftur sınıfı türünden nes_tur adlı bir nesne oluşturur. Bu nesne yoluyla ana sınıf içindeki değişken ve fonksiyonlara erişim sağlayamaz.
Sonra, aynı nesne ile, siniftur içindeki deger_ata_tur() fonksiyonu ile sinifana sınıfının protected ve public değişkenlerine erişim sağlayarak, bu değişkenlere birer değer atar. Aynı fonksiyon ile priidtur, proidtur ve pubidtur değişkenlerine de birer değer atar. Son olarak, deger_goster_tur() fonksiyonu ile siniftur sınıfı içindeki değişken değerlerini ekrana yazar.
Sonra, sinifturtur sınıfı türünden nes_turtur adlı bir nesne oluşturur. Bu nesne yoluyla ana sınıf içindeki değişken ve fonksiyonlara erişim sağlayamaz.
Sonra, aynı nesne ile, siniftur içindeki deger_ata_tur() fonksiyonu ile sinifana sınıfının protected ve public değişkenlerine erişim sağlayarak, bu değişkenlere birer değer atar. Aynı fonksiyon ile priidtur, proidtur ve pubidtur değişkenlerine de birer değer atar. Son olarak, deger_goster_tur() fonksiyonu ile siniftur sınıfı içindeki değişken değerlerini ekrana yazar.
Daha sonra, aynı nesne ile, kendi sınıfı içindeki deger_ata_turtur() fonksiyonu ile siniftur sınıfının protected ve public değişkenlerine erişim sağlayarak, bu değişiken değerlerini kullanarak, kendi değişkenlerine değer atar. Son olarak, sinifturtur sınıfı içindeki değişken değerlerini ekrana yazar.
Ana sınıftan yapılan kalıtım işlemi private olarak yapıldığından, ana sınıfın tüm elemanları siniftur sınıfının private elemanı olur. Bu nedenle, sinifana sınıfı içindeki protected ve public değişkenlere sadece siniftur sınıfı içindeki fonksiyonlar yoluyla erişim sağlayabilir, sinifturtur sınıfı içindeki fonksiyonlar ise erişim sağlayamaz.
Programda oluşturulan sınıfların içindeki elemanlar ile bu sınıflardan oluşturulan nesnelerin erişim durumlarını gösteren şema aşağıdadır:
Bir ana sınıftan protected erişim türü kullanılarak bir sınıf türetildiğinde, ana sınıfın tüm public ve protected elemanları türetilen sınıfın protected elemanı olur.
Bu özelliği bir örnek üzerinde incelemeye çalışalım:
#include <iostream>
using namespace std;
class sinifana {
private:
// Bu değişkene sadece sinifana içindeki fonksiyonlar erişim sağlayabilir.
int priidana;
protected:
// Bu değişkene sinifana ve siniftur içindeki fonksiyonlar erişim sağlayabilir.
int proidana;
public:
// Bu değişkene sinifana içindeki fonksiyonlar ve sinifana türünden oluşturulmuş nesneler ile
// siniftur içindeki fonksiyonlar doğrudan erişim sağlayabilir.
int pubidana;
void deger_ata(int pid1, int pid2, int pid3)
{
priidana = pid1; proidana = pid2; pubidana = pid3;
cout << "sinifana değişkenlerine değer atama: " << priidana << " " << proidana << " " << pubidana << endl;
}
void deger_goster() { cout << "sinifana değişken değerleri: " << priidana << " " << proidana << " " << pubidana << endl; }
};
class siniftur : protected sinifana {
private:
int priidtur;
protected:
int proidtur;
public:
int pubidtur;
// Türetilen sınıf içindeki fonksiyonlar direk olarak
// sadece türetilen sınıf değişkenlerine erişim sağlayabilir.
void deger_ata_tur(int pid1, int pid2, int pid3, int pid4, int pid5)
{
proidana = pid1; pubidana = pid2; // Ana sınıf değişkenlerine değer atama
priidtur = pid3; proidtur = pid4; pubidtur = pid5; // Türetilen sınıf değişkenlerine değer atama
cout << "sinifana değişkenlerine değer atama: " << proidana << " " << pubidana << endl;
cout << "siniftur değişkenlerine değer atama: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
void deger_goster_tur()
{
cout << "sinifana değişken değerleri: " << proidana << " " << pubidana << " " << endl;
cout << "siniftur değişken değerleri: " << priidtur << " " << proidtur << " " << pubidtur << endl;
}
};
int main(void)
{
sinifana nes_ana;
cout << "nes_ana değişkeninin sinifana elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------" << endl;
nes_ana.deger_ata(7, 21, 165);
nes_ana.deger_goster();
// nes_ana.priidana = 954; // Derleme hatası verir (Nesne sınıf içindeki private değişkene doğrudan erişim sağlayamaz).
// nes_ana.proidana = 954; // Derleme hatası verir (Nesne sınıf içindeki protected değişkene doğrudan erişim sağlayamaz).
nes_ana.pubidana = 954; // Nesne sınıf içindeki public değişkene doğrudan erişim sağlar.
nes_ana.deger_goster();
siniftur nes_tur;
cout << endl << "nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi:" << endl;
cout << "------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, sinifana sınıfı fonksiyonları yoluyla
// sinifana sınıfı değişkenlerine değer atayamaz ve ekrana yazamaz.
// nes_tur.deger_ata(8, 25, 246); // public kalıtımda normal çalışır, private ve protected kalıtımda derleme hatası verir.
// nes_tur.deger_goster(); // public kalıtımda normal çalışır, private ve protected kalıtımda derleme hatası verir.
// Türetilen sınıf nesnesi ana sınıf içindeki private ve protected değişkenlere doğrudan erişim sağlayamaz.
// nes_tur.priidana = 741; // public ve private kalıtımda derleme hatası verir.
// nes_tur.proidana = 741; // public ve private kalıtımda derleme hatası verir.
// nes_tur.pubidana = 741; // public kalıtımda normal çalışır, private ve protected kalıtımda derleme hatası verir.
// nes_tur.deger_goster(); // public kalıtımda normal çalışır, private kalıtımda derleme hatası verir.
cout << endl << "nes_tur değişkeninin sınıfana ve siniftur elemanlarına erişimi:" << endl;
cout << "---------------------------------------------------------------" << endl;
// siniftur sınıfından oluşturulan nesne, kendi fonksiyonları yoluyla
// sinifana ve siniftur içindeki protected ve public değişkenlere değer atar ve ekrana yazar.
nes_tur.deger_ata_tur(9, 16, 4, 17, 28); // İlk iki parametre anasinif değişken değerleri için değer atar.
nes_tur.deger_goster_tur();
nes_tur.pubidtur = 687;
nes_tur.deger_goster_tur();
return 0;
}
Yukarıdaki programı derleyip çalıştırdığımızda, aşağıdaki ifadeleri ekrana yazar:
nes_ana değişkeninin sinifana elemanlarına erişimi: --------------------------------------------------- sinifana değişkenlerine değer atama: 7 21 165 sinifana değişken değerleri: 7 21 165 sinifana değişken değerleri: 7 21 954 nes_tur değişkeninin sinifana elemanlarına doğrudan erişimi: ------------------------------------------------------------ nes_tur değişkeninin sınıfana ve siniftur elemanlarına erişimi: --------------------------------------------------------------- sinifana değişkenlerine değer atama: 9 16 siniftur değişkenlerine değer atama: 4 17 28 sinifana değişken değerleri: 9 16 siniftur değişken değerleri: 4 17 28 sinifana değişken değerleri: 9 16 siniftur değişken değerleri: 4 17 687
Program, sinifana adlı bir sınıf ve bu sınıftan protected olarak türetilen siniftur adlı bir sınıf oluşturur. Her iki sınıf içinde de private, protected ve public olmak üzere üç adet değişken ve bu değişkenlere değer atayan ve ekranda gösteren iki adet fonksiyon tanımlar.
Program çalışmaya başladığında, sinifana cinsinden bir nesne tanımlar. Ana sınıf nesnesi yoluyla, ana sınıf fonksiyonlarını çağırarak, önce ana sınıf içindeki değişkenlere birer değer atar sonra değişken değerlerini ekrana yazar. Ana sınıf nesnesini kullanarak doğrudan ana sınıf içinde public pubidana değişkenine bir değer atar ve ana sınıf içindeki deger_goster() fonksiyonu ile değişken değerlerini tekrar ekrana yazar.
Program, ikinci safhada türetilmiş sınıf olan siniftur türünden nes_tur adlı bir nesne oluşturur. Bu nesne yoluyla ana sınıf içindeki fonksiyonlara erişim sağlayamaz.
Sonra, aynı nesne ile, türetilen sınıf içindeki deger_ata_tur() fonksiyonu ile sinifana içindeki proidana ve pubidana değişkenleri ile siniftur içindeki priidtur, proidtur ve pubidtur değişkenlerine birer değer atar. Son olarak, sinifana içindeki proidana ve pubidana değişkenler ile siniftur içindeki değişken değerlerini ekrana yazar.
Bir sınıftan public kalıtım ile bir sınıf türetildiğinde, türetilmiş sınıftan oluşturulan bir nesne ile ana sınıfın protected ve public değişkenlerine erişim sağlanırken, kalıtım protected olarak yapıldığında, ana sınıfın protected ve public değişkenlerine türetilen sınıfın fonksiyonlarından erişim sağlanmaktadır.