NESNEYE YÖNELİK PROGRAMLAMA



Benzer belgeler
NESNEYE YÖNELİK PROGRAMLAMA

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

C++ Dersi: Nesne Tabanlı Programlama

Kalıtım (Inheritance)

1 PROGRAMLAMAYA GİRİŞ

NESNEYE YÖNELİK PROGRAMLAMA

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

C++ Dersi: Nesne Tabanlı Programlama

Nesne Yönelimli Programlama

C++ Dersi: Nesne Tabanlı Programlama

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

C++ Dersi: Nesne Tabanlı Programlama

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

C++ Dersi: Nesne Tabanlı Programlama

C++ Dersi: Nesne Tabanlı Programlama

NESNEYE YÖNELİK PROGRAMLAMA THIS İŞARETÇİSİ, KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR,NESNE DİZİLERİ

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Ders 8 Konu Özeti ve Problemler

C++ Dersi: Nesne Tabanlı Programlama 2. Baskı

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

BTEP243 Ders 3. class Yazım Kuralı:

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

C++ Dersi: Nesne Tabanlı Programlama

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

BİLG Dr. Mustafa T. Babagil 1

Sunum İçeriği. Programlamaya Giriş

NESNE MODELLERİ : SINIFLAR

Örnek 4: Örnek Özyinelemeli fonksiyon örneği Bölüm 9. C++ programlama dilinde Nesne ve sınıf

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

NESNEYE YÖNELİK PROGRAMLAMA Temel Kavramlar

BİL-141 Bilgisayar Programlama I (Java)

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

Karakter katarları ile ilgili fonksiyonlar içerir Yerel kayan noktalı sayılar tanımlanır

Nesne Yönelimli Programlama ve Kalıtım

Operator Aşırı Yükleme (Operator OverLoading)

Dizi nin Önemi. Telefon rehberindeki numaralar, haftanın günleri gibi v.b.

Göstericiler (Pointers)

C# Metotlar ve Metot Tanımlama

YZM 2105 Nesneye Yönelik Programlama

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

C++ ile Nesneye Dayalı Programlama

Veri Yapıları Lab Notları 1

Pointer Kavramı. Veri Yapıları

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

BİL-142 Bilgisayar Programlama II

BİLGİSAYAR MÜHENDİSLİĞİ ALGORİTMA VE PROGRAMLAMA II 2.HAFTA SWİTCH (CASE), SAYAÇLAR, DÖNGÜLER,

NESNEYE YÖNELİK PROGRAMLAMA

Bölüm 12. Nesne yönelimli programlama desteği

Nesneye Yönelik Programlama (OOP) 7.Hafta

KOCAELİ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

TEMPLATES. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. C++ ile Nesneye Dayalı Programlama 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Ders 8: Metotlar. barisgokce.com

Inheritance. Inheritance (turetim)

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

HSancak Nesne Tabanlı Programlama I Ders Notları

Arayüz (Interface) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 1

Nesne İşaretçileri. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. Sınıf Yapısı. Kalıtım Çok Şekillilik

7. HAFTA. Erişim Belirleyiciler

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

BMT 101 Algoritma ve Programlama I 5. Hafta. Yük. Müh. Köksal Gündoğdu 1

10/17/2007 Nesneye Yonelik Programlama 3.1

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Nesne Yönelimli Programlamaya Giriş - 2. Cem Ahmet MERCAN 16/04/2009

Bu parçalar arasındaki ilişkiyi kullanıp büyük çaplı programlar geliştirme tekniğine de nesne yönelimli programlama denir.

C++ Operatörler (Operators)

Genel Programlama II

Statik veri üyeleri sınıf dosyası içerisinde, ancak sınıf bildirimi dışında başlatılmalıdır. Statik üye fonksiyonları

Operatörlere İşlev Yükleme

NESNE TABANLI PROGRAMLAMA

Nesne Tabanlı Programlama

8. İŞARETCİLER (POINTERS)

BÖLÜM 11: YAPISAL VERİ TİPLERİ

Lambda İfadeleri (Lambda Expressions)

NESNEYE YÖNELİK PROGRAMLAMA. Yrd.Doç.Dr. Zeynep ORMAN

Algoritma ve Programlama: Karar Yapıları ve Döngüler

YZM 2105 Nesneye Yönelik Programlama

Erişim konusunda iki taraf vardır:

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 9

Object-Oriented Programming Laboratuvar 11

İsimler ve Kapsam. Hafta 4 Ders 2 BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

C++ Dersi: Nesne Tabanlı Programlama

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

BMT 101 Algoritma ve Programlama I 2. Hafta. Yük. Müh. Köksal GÜNDOĞDU 1

HSancak Nesne Tabanlı Programlama I Ders Notları

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

String ve Karakter Dizileri. Yrd. Doç. Dr. Fehim KÖYLÜ Erciyes Üniversitesi Bilgisayar Mühendisliği Bölümü

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

ELN1001 BİLGİSAYAR PROGRAMLAMA I

WEB PROGRAMLAMA II. Öğr. Gör. M. Mutlu YAPICI. Ankara Üniversitesi Elmadağ Meslek Yüksekokulu

Transkript:

NESNEYE YÖNELİK PROGRAMLAMA KALITIM Özlem AYDIN Trakya Üniversitesi Bilgisayar Mühendisliği Bölümü Not: Bu sunumda Prof. Dr. Yılmaz KILIÇASLAN ın Nesneye Yönelik Programlama dersi sunumlarından faydalanılmıştır.

2 Sunum Planı Temel ve türetilmiş sınıflar Temel sınıfların elemanlarının yeniden tanımlanması Temel ve türetilmiş sınıflar arasında dönüşüm Erişim kuralları Yapıcı ve yıkıcı fonksiyonların çağrılma sırası Çoklu kalıtım Üst sınıf yapıcı fonksiyonlarına parametre geçirilmesi

3 Sınıflar Arasındaki İlişkiler - 1 C++, yeni veri tipleri tanımlamayı kolaylaştırmanın yanında, bu veri tipleri arasında çeşitli ilişkilerin kurulmasına da olanak sağlar. Aşağıdaki cümlelere bakarak, sınıflar arasında ne tür ilişkiler olabileceğini belirleyiniz: A daisy is a kind of flower. A rose is a (different) kind of flower. Red roses and yellow roses are both kinds of roses. A petal is a part of both kinds of flowers. Ladybugs eat certain pests such as aphids, which may be infesting certain kinds of flowers.

4 Sınıflar Arasındaki İlişkiler - 2 In all, there are three basic kinds of class relationships: 1. The first of these is generalization/specialization, denoting an "is a" relationship. For instance, a rose is a kind of flower, meaning that a rose is a specialized subclass of the more general class, flower. 2. The second is whole/part, which denotes a "part of" relationship. Thus, a petal is not kind of a flower; it is a part of a flower. 3. The third is association, which denotes some semantic dependency among otherwise unrelated classes, such as between ladybugs and flowers.

5 Sınıflar Arasındaki İlişkiler - 3 C++ ta, sınıflar arasındaki genel/özel ( is a ) ilişkisi ve bundan kaynaklı türlü işlevsellikler: bir veri tipini bir diğerinin alt-tipi olarak tanımlamaya imkan veren kalıtım / miras ( inheritance ) mekanizması ve birbiriyle ilişkili veri tiplerini bir arada kullanmaya imkan veren çok-biçimlilik ( polymorphism ) mekanizması ile kurulur.

6 Veriler Arası İlişkilerin C de İfadesi - 1 Bir şirketin, düzenli işçiler, satış elemanları yöneticiler gibi çalışanlarının olduğunu ve bu çalışanlar hakkındaki bilgileri tutan bir programa ihtiyacımız olduğunu varsayalım.

7 Veriler Arası İlişkilerin C de İfadesi - 2 Eğer programı C dilini kullanarak yazacaksak, bir yaklaşım isim, doğum tarihi ve sosyal sigorta numarası gibi eleman sahaları olan calisan isimli bir yapı (structure) tanımlamak olabilir. Fakat, her tip çalışanın az da olsa farklı bilgileri gerektireceği, bir sorun olarak karşımıza çıkacaktır. Örneğin, düzenli bir işçinin ücreti, çalıştığı toplam saat miktarı ve saat ücreti; satış elemanın ücreti, normal ücret artı yaptığı her satış için aldığı komisyon üzerinden hesaplanırken; yöneticinin, haftalık sabit bir ücreti olabilecektir.

8 Veriler Arası İlişkilerin C de İfadesi - 3 Her tip çalışan için ayrı bir yapı tanımlamak bir başka yaklaşım olabilir. Fakat, bu durumda herhangi bir çalışanı girdi olarak bekleyen bir fonksiyon yazmak mümkün olmayacaktır. Bir diğer alternatif calisan yapısını bütün olası sahaları barındıracak şekilde tanımlamak olacaktır. Bu ise her çalışan için boş sahalar olması nedeniyle gereksiz alan kullanımına yol açacaktır. C de bir çözüm union içeren bir yapı tanımlamak olacaktır.

9 Veriler Arası İlişkilerin C de İfadesi - 4 // İliskili verilerin C de ifade edilmesine örnek struct isci_ucreti float saat_ucreti; float calisma_suresi; } struct satis_elemani_ucreti float saat_ucreti; float calisma_suresi; float komisyon; float satis_miktari; } struct yonetici_ucreti float haftalik_ucret; }

Veriler Arası İlişkilerin C de İfadesi - 5 enum CALISAN_TIPI ISCI, SATIS_ELEMANI, YONETICI struct calisan char isim[30]; CALISAN_TIPI tip; union struct isci_ucreti ucretli_calisan; struct satis_elemani_ucreti komisyonla_calisan; struct yonetici_ucreti haftalik_ucretli; 10

11 Veriler Arası İlişkilerin C de İfadesi - 6 // İliskili verilerin C de ifade edilmesine ornek: float odeme_hesapla( struct calisan *emp ) switch ( emp->tip ) case ISCI: return emp->ucretli_calisan.saat_ucreti * ucretli_calisan.calisma_suresi; break; case SATIS_ELEMANI: return emp->komisyonla_calisan.saat_ucreti * komisyonla_calisan.calisma_suresi + komisyonla_calisan.komisyon * komisyonla_calisan.satis_miktari; break; case YONETICI: return emp->haftalik_ucretli.haftalik_ucret; break; //... }

12 Veriler Arası İlişkilerin C++ da İfadesi - 1 Çalışanlara ilişkin verileri tutan programı C++ da yazdığımızı varsayalım. İlk olarak, bütün çalışanların ortak özelliklerini betimleyen Calisan adlı bir sınıf tanımlarız: class Calisan public: Calisan(); Calisan(const char *nm); char *isimsoyle() const; private: char isim[30]; Örneği basitleştirmek için bu sınıf yalnızca çalışanın ismini tutmaktadır. Elbette, doğum tarihi, sosyal sigorta numarası ve adres gibi birçok diğer özelliği de kodlayabilirdi.

13 Veriler Arası İlişkilerin C++ da İfadesi - 2 Bir sonraki adımda özel tipte bir çalışanı, UcretliCalisan sınıfını tanımlarız. Bu sınıftakiler bütün çalışanların ortaklaşa sahip olduğu özellikleri ve bazı fazladan özellikleri taşıyacaklardır. UcretliCalisan sınıfını tanımlarken, Calisan sınıfını iki şekilde kullanabiliriz: Calisan nesnesini UcretliCalisan sınıfının bir eleman nesnesi yapabiliriz veya UcretliCalisan sınıfını Calisan sınıfının bir altsınıfı olarak tanımlayabiliriz.

14 Veriler Arası İlişkilerin C++ da İfadesi - 3 Sınıf türetimi için genel format: class türetilmiş_sınıf_ismi:türetim_modu temel_sınıf_ismi // Sınıf Gövdesi class UcretliCalisan:public Calisan // Sınıf Gövdesi

Veriler Arası İlişkilerin C++ da İfadesi - 4 // Calisan sinifinin bir alt-sinifi class UcretliCalisan:public Calisan public: UcretliCalisan(const char *nm); void UcretBelirle(float ucrt); void SureBelirle(float st); private: float ucret; float saat; Türetilmiş bir sınıfın bildiriminde onu temel sınıftan ayıran özellikler kodlanır. 15

16 Veriler Arası İlişkilerin C++ da İfadesi - 5 UcretliCalisan sınıfının her bir nesnesi kendisi için tanımlanmışlara ek olarak Calisan sınıfının da eleman sahalarını içerir. Bir UcretliCalisan nesnesi için, Calisan sınıfının da UcretliCalisan sınıfının da eleman fonksiyonları çağrılabilir: UcretliCalisan isci( Ali Uzun ); char *str; isci.surebelirle(40.0); str = isci.isimsoyle();

17 Veriler Arası İlişkilerin C++ da İfadesi - 6 Türetilmiş bir sınıf temel sınıfın özel korumalı (private) eleman sahalarına erişemez: void UcretliCalisan::isimYaz() const cout << İscinin ismi: << isim << \n ; // Error } Bu kısıt sarmalama (encapsulation) prensibinin bir gereğidir. Türetilmiş bir sınıf da temel sınıfın açık korumalı (public) arayüzünü kullanmalıdır: void UcretliCalisan: :isimyaz() const cout << İscinin ismi: << isimsoyle() << \n ; }

18 Veriler Arası İlişkilerin C++ da İfadesi - 7 C++ örneğimizi, C örneğimize daha çok benzer kılmak için, satış elemanlarını ve yöneticileri betimleyen sınıflar tanımlamalıyız. Satış elemanları bir tür ücretli çalışan olduğu için SatisElemani sınıfını UcretliCalisan sınıfından türetebiliriz: class SatisElemani:public UcretliCalisan public: SatisElemani(const char *nm); void komisyonbelirle(float kom); void satislaribelirle(float satislar); private: float komisyon; float satismiktari;

19 Veriler Arası İlişkilerin C++ da İfadesi - 8 Bir SatisElemani nesnesi, Calisan ve UcretliCalisan sınıflarının bütün eleman sahalarını içerir. Bu üç sınıfın herhangi bir eleman fonksiyonu bir SatisElemani nesnesi için çağrılabilir. Ayrıca, SatisElemani sınıfının hem türetilmiş hem de temel bir sınıf işlevi gördüğüne dikkat ediniz. C++ da istenilen sayıda kalıtım düzeyi tanımlanabilir.

20 Veriler Arası İlişkilerin C++ da İfadesi - 9 Yöneticiler, sabit maaşlı çalışanlardır. Dolayısıyla, Yönetici sınıfı, Calisan sınıfından aşağıdaki şekilde türetilebilir: class Yonetici:public Calisan public: Yonetici(const char *nm); void maasbelirle(float maas); private: float haftalikmaas;

21 Veriler Arası İlişkilerin C++ da İfadesi - 10 Dört sınıf arasında tanımlamış olduğumuz kalıtım ilişkisi şematik olarak aşağıdaki gibi gösterilebilir: Calisan UcretliCalisan Yonetici SatisElemanı

22 Temel Sınıfın Elemanlarını Yeniden Tanımlama - 1 Şimdi çalışanlara yapılacak haftalık ödemelerin nasıl hesaplanacağına bakalım. İlk olarak UcretliCalisan sınıfı için bir odemehesapla eleman fonksiyonu tanımlayabiliriz: float UcretliCalisan::odemeHesapla() const return ucret*saat; }

23 Temel Sınıfın Elemanlarını Yeniden Tanımlama - 2 SatisElemani sınıfı için de bir odemehesapla eleman fonksiyonu tanımlayabiliriz. Fakat, bu fonksiyon üst sınıfının özel korumalı elemanlarına erişemeyeceği için, aşağıdaki tarzda bir kodlama hata üretecektir: float SatisElemani::odemeHesapla() const return ucret*saat + komisyon*satismiktari; //Error }

24 Temel Sınıfın Elemanlarını Yeniden Tanımlama - 3 Üst sınıfın açık korumalı bir eleman fonksiyonunu çağırmalıyız. Fakat, bu da sorunu çözmeyecektir: float SatisElemani::odemeHesapla() const return odemehesapla()+komisyon*satismiktari; } Yukarıdaki fonksiyondaki (semantik) sorunu tespit ediniz.

25 Temel Sınıfın Elemanlarını Yeniden Tanımlama - 4 Derleyici odemehesapla ifadesiyle SatisElemani sınıfının ilgili fonksiyonunun çağrıldığını varsayacak ve bu da sonsuz özyinelemeye yol açacaktır. Üst-sınıfın fonksiyonuna erişmek içim kapsam çözümleme operatörünü (::) kullanmak gerekecektir: float SatisElemani::odemeHesapla() const return UcretliCalisan::odemeHesapla()+komisyon*satisMiktari; }

Temel Sınıfın Elemanlarını Yeniden Tanımlama - 5 Özetle, türetilmiş sınıfın bir nesnesi için yeniden tanımlanmış bir fonksiyon çağrıldığında, fonksiyonun türetilmiş sınıfa ait olan versiyonu kullanılır: SatisElemani satici( oya özsoy ); satici.saatbelirle(40.0); satici.ucretbelirle(6.0); satici.komisyonbelirle(0.05); satici.satislaribelirle(2000.0); // Saticinin toplam maas hesaplamasi cout << Saticinin maasi: << satici.odemehesapla() << \n ; // Saticinin baz maas hesaplamasi cout << Saticinin baz maasi: << satici.ucretlicalisan::odemehesapla() << \n ; 26

27 Temel Sınıfın Elemanlarını Yeniden Tanımlama - 6 Yonetici sınıfı için de bir odemehesapla fonksiyonu tanımlayabiliriz: float Yonetici::odemeHesapla()const return haftalikmaas; } Bu fonksiyon UcretliCalisan veya SatisElemani sınıflarında tanımlı benzer isimli fonksiyonların yeniden tanımlanmasına yol açmayacaktır; çünkü bu sınıfların ikisi de Yonetici sınıfı ile bir temel ya da türetilmiş sınıf ilişkisi içinde değillerdir.

28 Temel ve Türetilmiş Sınıflar Arasında Dönüşüm - 1 C++, örtük olarak bir türetilmiş sınıf nesnesinin temel sınıf nesnesine dönüştürülmesine izin verir: UcretliCalisan isci; SatisElemani satici; isci = satici; // türetilmiş => temel Fakat, ters yönlü dönüşüm mümkün değildir: satici = isci; // Error

29 Temel ve Türetilmiş Sınıflar Arasında Dönüşüm - 2 Aynı zamanda türetilmiş sınıf nesnesine işaret eden bir işaretçi temel sınıf nesnesine işaret eden bir işaretçiye dönüştürülebilir: Calisan *c_ptr; UcretliCalisan isci( Ali Uzun ); SatisElemani satici( Ayse Akman ); Yonetici patron( Mehmet Baycan ); // UcretliCalisan * => Calisan * c_ptr = &isci; // SatisElemani * => Calisan * c_ptr = &satici; // Yonetici * => Calisan * c_ptr = &patron;

30 Temel sınıflara erişim kontrolü class türetilmiş_sınıf_ismi:türetim_modu temel_sınıf_ismi // Sınıf Gövdesi Burada türetim_modu yerine şu üç anahtar kelimeden bir tanesi yazılabilir: public, private, protected.

31 Protected erişim türü Bazı durumlarda bir özellik veya metodun dışarıya kapalı olması ancak o sınıftan türeyenlere açık olması istenebilir. Bu durumda 'protected' erişim belirleyicisi kullanılır. Temel sınıfa ait protected üyelere, bu sınıftan türetilmiş sınıflara ait üyeler erişebilir. Temel sınıfın veya türetilmiş sınıfların dışından bu protected üyelere erişilemez. Protected erişim türü sınıf içerisinde herhangi bir yerde bulunabilir. class sınıf_ismi //private üyeler protected: //opsiyonel //protected üyeler public: //public üyeler

32 Erişim Kuralları - 1 Kalıtım hiyerarşisi içinde organize olmuş sınıflar arasındaki erişim kuralları aşağıdaki gibidir: Bir sınıfa ait private elemanlara, arkadaş sınıf ve arkadaş fonksiyonlar haricinde, dışarıdan erişmek mümkün değildir. Bir alt sınıf, türetildiği sınıfın public ve protected elemanlarına erişebilir. Türetiliş modu public ise, üst sınıfa ait public ve protected elemanlar alt sınıfın da sırasıyla public ve protected elemanları olurlar. Türetiliş modu private ise üst sınıfa ait public ve protected elemanlar alt sınıfın private elemanları olurlar. Türetiliş modu protected ise üst sınıfa ait public ve protected elemanlar alt sınıfın protected elemanları olurlar. Türetiliş modunun belirtilmediği durumda, türetilen sınıf ise varsayılan türetim modu private olur.

33 Erişim Kuralları - 2 #include <iostream> using namespace std; class Personel public: Personel() cout << Yap.Fonk. Personel!\n ; } ~Personel() cout << Yik.Fonk.-Personel!\n ; } class Akademisyen:private Personel public: Akademisyen() cout << Yap.Fonk. Akademisyen!\n ; } ~Akademisyen() cout << Yik.Fonk. Akademisyen!\n ; } class Idari:private Personel public: Idari() cout << Yap.Fonk. Idari!\n ; } ~Idari() cout << Yik.Fonk. Idari!\n ; }

34 Erişim Kuralları - 3 class ArasGor:public Akademisyen public: ArasGor() cout << Yap.Fonk.-ArasGor!\n ; } ~ArasGor() cout << Yik.Fonk. ArasGor!\n ; } class OgrGor:public Akademisyen public: OgrGor() cout << Yap.Fonk. OgrGor!\n ; } ~OgrGor() cout << Yik.Fonk. OgrGor!\n ; } int main() OgrGor kisi; cout << MAIN! ; return 0; }

35 Erişim Kuralları - 4 Aşağıdaki ifadeleri Doğru veya Yanlış olarak sınıflayınız: Akademisyen sınıfından Personel sınıfının private elemanlarına erişilemez. Akademisyen sınıfından Personel sınıfının public ve protected elemanlarına erişilemez. Araştırma-Görevlisi sınıfından Akademisyen sınıfının private elemanlarına erişilemez. Araştırma-Görevlisi sınıfından Akademisyen sınıfının public ve protected elemanlarına erişilemez. Araştırma-Görevlisi sınıfından Personel sınıfının private elemanlarına erişilebilir. Araştırma-Görevlisi sınıfından Personel sınıfının public ve protected elemanlarına erişilebilir. Araştırma-Görevlisi sınıfından türetilmiş bir başka sınıf olsaydı, Akademisyen sınıfının public ve protected elemanlarına erişemeyecekti.

36 Kalıtım ve Yapıcı / Yıkıcı Fonksiyonlar Kalıtım söz konusu olduğunda yapıcı ve yıkıcı fonksiyonlara ilişkin iki sorunun cevaplanması gerekir: 1. Temel sınıf ve türetilmiş sınıf yapıcı ve yıkıcı fonksiyonları ne zaman çağrılır? 2. Temel sınıfın yapıcı fonksiyonlarına parametre nasıl geçirilir?

37 Yapıcı ve Yıkıcı Fonksiyonların Çağrılış Sırası Yapıcı fonksiyonların çağrılışında öncelik temel sınıflarda, yıkıcı fonksiyonların çağrılışında öncelik türetilmiş sınıflardadır. Bir önceki programın çıktısı aşağıdaki gibi olacaktır. Yap.Fonk.-Personel! Yap.Fonk.-Akademisyen! Yap.Fonk.-OgrGor! MAIN! Yik.Fonk.-OgrGor! Yik.Fonk.-Akademisyen! Yik.Fonk.-Personel!

38 Çoklu Kalıtım - 1 Kalıtım yapısı içerisinde bir sınıfın bağlı olduğu temel sınıf sayısı üzerinde herhangi bir kısıtlama yoktur. Bir sınıf, birden fazla sınıf için baz sınıf olabilir. Diğer yandan, herhangi bir sınıf da birden fazla sınıftan türetilmiş olabilir. Bu duruma çoklu kalıtım denir. Çoklu kalıtım söz diziminin genel formatı: class türetilmiş_sınıf_ismi : türetim_modu1 temel_sınıf_ismi1, türetim_modu2 temel_sınıf_ismi2,... türetim_modun temel_sınıf_ismin // Sınıf Gövdesi

39 Çoklu Kalıtım - 2 #include <iostream> using namespace std; class Personel public: Personel() cout << Yap.Fonk. Personel!\n ; } ~Personel() cout << Yik.Fonk.-Personel!\n ; } class Akademisyen:public Personel public: Akademisyen() cout<< Yap.Fonk. Akademisyen!\n ;} ~Akademisyen() cout<< Yik.Fonk. Akademisyen!\n ;}

40 Çoklu Kalıtım - 3 class Idari:public Personel public: Idari() cout << Yap.Fonk. Idari!\n ; } ~Idari() cout << Yik.Fonk. Idari!\n ; } class Bolum_Baskani:public Akademisyen, public Idari public: Bolum_Baskani() cout << Yap.Fonk.-B_Baskan!\n ; } ~Bolum_Baskani() cout<< Yik.Fonk. B_Baskan!\n ; } int main() Akademisyen akademisyen1; Idari idari1; Bolum_Baskani baskan; return 0; }

41 Çoklu Kalıtım - 4 Program Çıktısı: Yap.Fonk.-Personel Yap.Fonk.-Akademisyen Yap.Fonk.-Personel Yap.Fonk.-Idari Yap.Fonk.-Personel Yap.Fonk.-Akademisyen Yap.Fonk.-Personel Yap.Fonk.-Idari Yap.Fonk.-Bolum_Baskani...

42 Çoklu Kalıtım - 5 Kalıtım hiyerarşisi içerisinde herhangi bir nesne için bir defadan fazla kullanılan sınıflarla karşılaşmak istemiyorsak bu sınıfları sanal baz sınıf olarak tanımlarız. Mevcut sözdiziminde, doğrudan türetilmiş sınıf tanımlamaları içerisinde kullanılan baz sınıf adlarının başına virtual ayrılmış kelimesi getirilerek baz sınıflar sanal baz sınıflara dönüştürülebilir: class Personel public: Personel() cout << Yap.Fonk. Personel!\n ;... } class Akademisyen : public virtual Personel public: Akademisyen()cout << Yap.Fonk. Akademisyen!\n ; }... }

43 Çoklu Kalıtım - 6 class Idari:public virtual Personel public: Idari() cout << Yap.Fonk. Idari!\n ; }... } class Bolum_Baskani:public Akademisyen,public Idari public: Bolum_Baskani()cout<< Yap.Fonk.Bolum_Baskani!\n ; }... } int main() Bolum_Baskani baskan; return 0; }

44 Çoklu Kalıtım - 7 Program Çıktısı: Yap.Fonk.-Personel Yap.Fonk.-Akademisyen Yap.Fonk.-Idari Yap.Fonk.-Bolum_Baskani...

45 Temel Sınıfın Yapıcı Fonksiyonuna Parametre Geçirilmesi -1 Temel sınıfların yapıcı fonksiyonlarına parametre geçirme işlemi türetilmiş sınıfın yapıcı fonksiyon bildirimini genişletmek suretiyle gerçekleştirilir. Bu genişletmenin genel formatı aşağıdaki gibidir: türetilmiş-yapıcı(arg-list):temel1(arg-list), temel2(arg-list), //... temeln(arg-list) // Türetilmiş Yapıcı Fonksiyonun Gövdesi } Genel olarak, türetilmiş sınıf yapıcı fonksiyonu hem kendi ihtiyacı olan hem de temel sınıfın gereksindiği parametreleri alır. Temel sınıfın gereksindikleri, yani : işaretinden sonra listelenenler, temel sınıf yapıcı fonksiyonuna geçirilir.

46 Temel Sınıfın Yapıcı Fonksiyonuna Parametre Geçirilmesi -2 #include <iostream> using namespace std; class temel protected: int i; public: temel(int x) i = x; cout << Yapici-temel\n ;} ~temel() cout << Yikici-temel\n ;} class turetilmis : temel int j; public: turetilmis(int x, int y) : temel(y) j = x; cout << Yapici-turetilmis\n ;} ~turetilmis() cout << Yikici-turetilmis\n ;} void goruntule()cout << i << << j << \n ;} int main() turetilmis ob(3, 4); ob.goruntule(); return 0; }

47 Özet Sınıflar arasında, asosiyasyon (association), parça-bütün (part-whole / has_a) ve genel-özel (generalization/specialization / is_a) ilişkileri kurulabilir. Sonuncu ilişki üzerinden, kalıtım mekanizması oluşturulabilir.