BİL-142 Bilgisayar Programlama II
(C/C++)
Hazırlayan: [Link] Akcayol
Gazi Üniversitesi
Bilgisayar Mühendisliği Bölümü
Konular
Giriş
Temel (Base) Sınıflar ve Türetilmiş (Derived) Sınıflar
protected Üyeler
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Türetilmiş Sınıflarda Constructor ve Destructor
public, protected ve private Inheritance
1
Giriş
Inheritance (miras alma), bir sınıfa ait data ve
fonksiyonların tekrar kullanılarak daha gelişmiş sınıf
üretilmesini sağlar.
Tüm data üyeleri ve fonksiyon üyelerini yeniden
oluşturarak bir yeni sınıf oluşturmak yerine mevcut
bir sınıfın üyelerini kullanarak yeni bir sınıf üretmek
daha kolaydır.
Mevcut sınıf base class, türetilen sınıf ise derived
class olarak adlandırılır.
Türetilmiş bir class, base class’ın private üyelerine
doğrudan erişemez.
Konular
Giriş
Temel (Base) Sınıflar ve Türetilmiş (Derived) Sınıflar
protected Üyeler
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Türetilmiş Sınıflarda Constructor ve Destructor
public, protected ve private Inheritance
2
Temel Sınıflar ve Türetilmiş Sınıflar
Bir sınıftan başka sınıflar üretilebilir. Bir çizgi class’ı
kullanılarak bir dikdörtgen veya başka şekil için yeni
bir class türetilebilir.
Türetilen yeni sınıf (derived-class), türetildiği sınıfın
(base class) bazı öelliklerini kullanabilir.
Araçlar base class olarak tanımlanırsa, çok sayıda
araç (otomobil, traktör, bot, uçak, bisiklet, ...)
üretilebilir.
Bir üniversitede çalışanlar için base class
oluşturulursa, akademik ve idari çalışanlara yönelik
iki sınıf türetilebilir.
Bir sınıf birden fazla sınıf kullanılarak türetilebilir.
5
Temel Sınıflar ve Türetilmiş Sınıflar
Bir sınıftan (single inheritance) ve birden fazla
sınıftan (multiple inheritance) türetilen sınıflar.
3
Temel Sınıflar ve Türetilmiş Sınıflar
Şekilde Shape inheritance hiyerarşisi görülmektedir.
Aşağıdaki kod public inheritance yapmaktadır.
Tüm inheritance yapılarında (private, protected, public), base
class içindeki private üyelere erişlemez ancak türetilmiş
sınıfında üyeleri sayılırlar.
Konular
Giriş
Temel (Base) Sınıflar ve Türetilmiş (Derived) Sınıflar
protected Üyeler
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Türetilmiş Sınıflarda Constructor ve Destructor
public, protected ve private Inheritance
4
protected Üyeler
Bir base class’ın public üyelerine, class üyeleri,
oluşturulan nesne, türetilmiş class’lardan oluşturulan
nesneler tarafından erişilebilir.
Bir base class’ın private üyelerine sadece o class
içindeki fonksiyonlar ve friends fonksiyonlar
tarafından erişilebilir.
protected ise public ve private arasında
erişim sağlar.
Bir base class’ın protected üyelerine o class’ın
üyeleri, friends fonksiyonları, o class’tan türetilen
class’ların üyeleri ve friends fonksiyonları tarafından
erişilebilir.
9
Konular
Giriş
Temel (Base) Sınıflar ve Türetilmiş (Derived) Sınıflar
protected Üyeler
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Türetilmiş Sınıflarda Constructor ve Destructor
public, protected ve private Inheritance
5
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Bir şirketin çalışanlarına yönelik uygulamada, komisyonla
çalışan elemanlar (commission employees) ve sabit
ücret+komisyonla çalışan elemanlar (base plus commission
employees) olsun.
Bu şirket için commission employees ile base salaried
commission employees arasındaki ilişki aşağıdaki farklı
örneklerle oluşturulabilir:
İlk örnekte, CommissionEmployee class’ı oluşturulup,
first name, last name, social security number,
commission rate ve gross sales amount
değişkenleri private tanımlanabilir.
İkinci örnekte, BasePlusCommissionEmployee class’ı
oluşturulup, first name, last name, social
security number, commission rate,gross sales
amount ve base salary değişkenleri private tanımlanır.
11
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Üçüncü örnekte, BasePlusCommissionEmployee
class’ının CommissionEmployee class’ından yeni bir
versiyonu oluşturulur ve private üyelere ulaşılmaya
çalışılır. Bu durumda compile hatası oluşur çünkü
türetilmiş class base class’ın private üyelerine ulaşamaz.
Dördüncü örnekte, CommissionEmployee class’ının
dataları protected tanımlanır, yeni bir
BasePlusCommissionEmployee class’ı oluşturulur ve
CommissionEmployee class’ının datalarına doğrudan
ulaşılabilir.
Beşinci örnekte, CommissionEmployee class’ının
dataları private tanımlanır,
BasePlusCommissionEmployee class’ı türetilir ve
CommissionEmployee class’ının fonksiyonlarıyla private
datalara erişilir. 12
6
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
CommisionEmployee class’ının oluşturulması
13
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
14
7
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
15
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
16
8
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
17
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
18
9
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
19
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
20
10
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
21
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
CommissionEmployee class’ı, bir constructor,
earnings isimli fonksiyon ve print isimli
fonksiyon üyelerine sahiptir.
get ve set fonksiyonları firstname, lastname,
socialSecurityNumber, grossSales ve
commisionRate dataları üzerinde işlem yapmak
için kullanılır.
CommissionEmployee class’ının constructor’ı data
üyelerine ilk değerlerini atar.
22
11
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
BasePlusCommissionEmployee class’ının inheritance
olmadan oluşturulması
23
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
24
12
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
25
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
26
13
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
27
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
28
14
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
29
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
30
15
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
31
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
32
16
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
CommissionEmployee class’ı ile
BasePlusCommissionEmployee class’ının birçok
kodu aynıdır. Örneğin firstName, lastName,
getFirstName, setFirstName, setLastName ve
getLastName aynıdır.
get ve set fonksiyonları ile ikisi de private data üyeleri
socialSecurityNumber, grossSales ve
commisionRate üzerinde işlem yapıyorlar.
BasePlusCommissionEmployee class’ının
constructor’ı farklı olarak baseSalary değerini set
ediyor.
BasePlusCommissionEmployee class’ının diğer
farklılıkları setBaseSalary ve getBaseSalary
fonksiyonlarıdır. 33
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
BasePlusCommissionEmployee class’ının inheritance
kullanılarak oluşturulması
34
17
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
35
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Türetilen class, base
class’ın private üyelerine
erişemez.
36
18
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
BasePlusCommissionEmployee class’ı
CommissionEmployee class’ı kullanılarak türetilmiştir.
public anahtar kelimesi,
BasePlusCommissionEmployee class’ının
CommissionEmployee class’ının tüm üyelerini
alacağını gösterir.
Türetilmiş class’lar base class’ların constructor’larını
alamazlar. Her class kendi constructor’ına sahiptir.
Önceki örnekte BasePlusCommissionEmployee
class’ı, CommissionEmployee class’ının private
üyelerine erişmeye çalıştığı için compile hatası verir.
Satır 35’te, getCommisionRate ve getGrossSales
fonksiyonları ile aynı değerler alınabilir. Aynı değişiklik
Satır 42-45’tede yapılabilir. 37
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
protected data kullanarak BasePlusCommissionEmployee-
CommissionEmployee inheritance oluşturulması
38
19
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
39
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
40
20
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
41
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
42
21
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
43
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
44
22
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
45
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
46
23
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
47
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
48
24
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
49
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
BasePlusCommissionEmployee class’ının
CommissionEmployee class’ındaki firstName,
lastName, socialSecurityNumber, grossSales
ve commissionRate data üylerine ulaşabilmesi için
protected tanımlanması gereklidir.
protected data üyeleri bir class’ın tüm üyeleri, friends
fonksiyonları ve o class’tan türetilmiş tüm class’ların
üyeleri ve friends fonksiyonları tarafından erişilebilir.
50
25
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Önceki örnekte CommissionEmployee class’ında
firstName, lastName, socialSecurityNumber,
grossSales ve commissionRate data üyleri
protected tanımlanmıştır.
protected tanımlanan data üyelerine get ve set
fonksiyonları olmadan erişilebildiği için performans artar.
Ancak protected tanımlanan data üyelerine türetilmiş
class’lar tarafından geçersiz değer atanabilir.
51
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
private data kullanarak BasePlusCommissionEmployee-
CommissionEmployee inheritance oluşturulması
52
26
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
53
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
54
27
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
55
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
56
28
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
57
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
58
29
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
59
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
60
30
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
61
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
62
31
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
63
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
En iyi yazılım mühendisliği yaklaşımı base class data
üyelerinin private tanımlanması ve public
fonksiyonlara erişime izin verilmesidir. Önceki örnekte bu
yönde yeniden düzenleme yapılmıştır.
CommissionEmployee class’ının data üyeleri
firstName, lastName, socialSecurityNumber,
grossSales ve commissionRate private
tanımlanmış ve public fonksiyonlar olan
getFirstName, setFirstName, getLastName,
setLastName, getSocialSecurityNumber,
setSocialSecurityNumber, getGrossSales,
setGrossSales, setCommissionRate,
getCommissionRate, earnings ve print ile
erişilebilmektedir. 64
32
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
BasePlusCommissionEmployee class’ı earnings
fonksiyonuna sahiptir. Ancak CommissionEmployee
class’ının earnings fonksiyonu ile baseSalary
değerini toplamaktadır.
CommissionEmployee class’ının fonksiyonlarına
türetilmiş class içinden erişmek için :: operatörü
kullanılır (CommissionEmployee::earnings()).
Türetilmiş class içinden base class fonksiyonunu
çağırırken :: kullanılmazsa sonsuz recursion oluşur.
65
Konular
Giriş
Temel (Base) Sınıflar ve Türetilmiş (Derived) Sınıflar
protected Üyeler
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Türetilmiş Sınıflarda Constructor ve Destructor
public, protected ve private Inheritance
33
Türetilmiş Sınıflarda Constructor ve Destructor
Bir türetilmiş class’tan nesne üretildiğinde, önce kendi
constructor’ını çağırır. Kendi constructor’ı çalıştırılmadan önce
base class constructor’ı çalıştırılır.
Eğer base class’ta başka class’tan türetilmişse bu işlem
önceki class içinde yapılır.
Önceki örneklerde BasePlusCommissionEmployee
class’ından bir nesne oluşturulduğunda,
CommissionEmployee constructor’ı çağırılır.
CommissionEmployee constructor’ının çalışması bitince
BasePlusCommissionEmployee constructor’ı çağırılır.
Bir türetilmiş class’ın destructor’ı çağırıldığında, sırasıyla
kendi destructor’ı ve base class destructor’ı çalıştırılır. Bu
işlem hiyerarşik olarak son base class’a kadar kaskad devam
eder.
67
Türetilmiş Sınıflarda Constructor ve Destructor
68
34
Türetilmiş Sınıflarda Constructor ve Destructor
69
Türetilmiş Sınıflarda Constructor ve Destructor
70
35
Türetilmiş Sınıflarda Constructor ve Destructor
71
Türetilmiş Sınıflarda Constructor ve Destructor
72
36
Türetilmiş Sınıflarda Constructor ve Destructor
73
Türetilmiş Sınıflarda Constructor ve Destructor
74
37
Türetilmiş Sınıflarda Constructor ve Destructor
75
Türetilmiş Sınıflarda Constructor ve Destructor
76
38
Türetilmiş Sınıflarda Constructor ve Destructor
77
Türetilmiş Sınıflarda Constructor ve Destructor
78
39
Konular
Giriş
Temel (Base) Sınıflar ve Türetilmiş (Derived) Sınıflar
protected Üyeler
Temel Sınıflar ve Türetilmiş Sınıflar Arasındaki İlişki
Türetilmiş Sınıflarda Constructor ve Destructor
public, protected ve private Inheritance
public, protected ve private Inheritance
Bir class kullanılarak yeni bir class türetilirken public,
private veya protected inheritance yapılabilir.
Genellikle public inheritance kullanılır.
Bir base class’tan yeni bir class public olarak türetilirse,
base class’ın public üyeleri türetilmiş class’ın public
üyeleri ve base class’ın protected üyeleri türetilmiş class’ın
protected üyeleri olur.
Türetilmiş class ile base class’ın private üyelerine ulaşılamaz.
Bir base class’tan yeni bir class protected olarak türetilirse,
base class’ın public ve protected üyeleri türetilmiş
class’ın protected üyeleri olur.
Bir base class’tan yeni bir class private olarak türetilirse,
base class’ın public ve protected üyeleri türetilmiş
class’ın private üyeleri olur.
80
40
public, protected ve private Inheritance
Türetilmiş sınıftaki erişim belrileyicisi base sınıftakinden daha
geniş olamaz.
81
public, protected ve private Inheritance
82
41
public, protected ve private Inheritance
Türetilen sınıfta kalıtım şekline göre erişim yapılabilir.
83
public, protected ve private Inheritance
public kalıtım
84
42
public, protected ve private Inheritance
protected kalıtım
85
public, protected ve private Inheritance
private kalıtım
86
43