KALITIM Yılmaz Kılıçaslan.

Slides:



Advertisements
Benzer bir sunumlar
Programlama-II (Java ile Bilgisayar Programlama)
Advertisements

C# - Metotlar.
Nesnelerin Özellikleri. - Üye nesneler - friend belirtesi - Nesnelerin operatörlere yüklenmesi - this yerel (lokal) değişkeni - inline tanımlı üye fonksiyonlar.
Göstericiler (Pointers)
Tuğba DEMİREL
SINIFLAR Yılmaz Kılıçaslan.
NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR
NESNEYE YÖNELİK PROGRAMLAMA KALITIM
Nesneye Dayalı Programlama
KOŞUL İFADELERİ onbirc.com/133.
Bölüm 2 C Dilinin Temelleri
OOP Tanımlar.
KOŞUL İFADELERİ GMGNKJG.
C++ STACK SINIFI.
SANAL FONKSİYONLAR VE ÇOK BİÇİMLİLİK
String Kütüphanesindeki Arama Fonksiyonları
Bölüm 10 Yapılar ve Birleşimler
NESNEYE DAYALI MODELLEME VE TASARIM
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 6: Sınıflar
KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR, NESNE DİZİLERİ Yılmaz Kılıçaslan.
SINIFLAR GİRİŞ Yılmaz Kılıçaslan.
NESNEYE YÖNELİK PROGRAMLAMA
Soru1: Bir tanesi tam sayı diğeri string olan iki elemanlı bir struct’ı bir başka struct’a direk kopyalama, memcpy kullanarak kopyalama ve tek tek elemanlarını.
DELEGATE OOP-UYG.
Erişim Denetimi, Fonksiyon
METODLAR.
KALITIM Yılmaz Kılıçaslan.
İSİM UZAYLARI (NAMESPACE)
C#.NET 5.0 C# .NET 5.0 Eğitimleri Volkan KANAT.
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ
C++ Temelleri C++ genel amaçlı, nesne tabanlı, yüksek seviye programlama dilidir.
Sınıflar ve Fonksiyonlar
NESNE YÖNELİMLİ PROGRAMLAMA
Metotlar.
Nesne Yönelimli Programlama Dersi
FONKSİYONLAR.
SABİT NESNE VE ELEMAN FONKSİYONLAR VE ELEMAN NESNELER
ÇOK BİÇİMLİLİK POLYMORPHISM
SINIF DİYAGRAMLARI (Class Diagrams). Temel Sınıf Gösterimi  En üstte sınıf ismi bulunur.  Özellikler (opsiyonel) –Sınıfa ait tüm alanları içermelidir.
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
Bilgisayar Programlama
JAVA’DA DÖNGÜLER.
Kalıtım , Sınıf Asli Ergün.
Demet AYDIN METODLAR Demet AYDIN
Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
Nesneye Dayalı Programlama
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ VE SINIFLARIN DİĞER ÖZELLİKLERİ Yılmaz Kılıçaslan.
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
SANAL FONKSİYONLAR VE ÇOKBİÇİMLİLİK Yılmaz Kılıçaslan.
DİZİLER Arrays.
Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri Dizgi Çıktı İşlemleri Dizgi Fonksiyonları Karakter Fonksiyonları Gösterge Dizgileri.
SINIFLAR GİRİŞ Yılmaz Kılıçaslan. Sunum Planı  Bu derste sınıf mekanizmasını şu yönleriyle inceleyeceğiz: –Sınıf kavramının evrimine kısa bir bakış –Bir.
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ Yılmaz Kılıçaslan.
SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
2. HAFTA 2. Hafta.
Veri yapıları Hafta3 Dizi Yapıları.
C Programlamada, benzer tipte tanımlaman değişkenleri kontrol etmede bize en çok yardım eden dostlarımız dizilerdir. Örneğin: 100 Öğrencinin bilgilerini.
BİLGİSAYAR programlama II
Hafta2 Rekürsif Algoritmalar
Temel Veri Yapıları Veri Yapıları 1. Bölüm 1. 2 Programlarımızda tanımladığımız nesneler ya tek parçadan ya da birden fazla parçadan oluşurlar. Tek parçadan.
VERİ ve BELLEK & DEĞİŞKENLERİN SAKLANMASI Asst.Prof.Dr.Misket YEKTAY Gizem AYIK.
KALITIM(INHERITANCE) Öğr.Gör. Murat ASLANYÜREK. KALITIM KAVRAMINA GİRİŞ  Kalıtım, sınıflardan yeni sınıflar türetmeyi sağlar.  Türetilen yeni sınıflar,
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
Fonksiyonlar ve Diziler
Nesneye Dayalı Programlama 1
NİŞANTAŞI ÜNİVERSİTESİ
Nesneye Dayalı Programlama 1
NİŞANTAŞI ÜNİVERSİTESİ
Sunum transkripti:

KALITIM Yılmaz Kılıçaslan

GİRİŞ 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. Söz konusu veri ilişkileri, 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. Bu iki mekanizmadan birincisi bu dersin, ikincisi ise gelecek dersin konusu olacaktır. Kalıtım başlığı altında aşağıdaki alt-konulara bakacağız: 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

VERİLER ARASI İLİŞKİLERİN C’DE İFADESİ - 1 Bir şirketin düzenli işçiler, satış elemanları, yöneticiler ve geçici çalışanlar gibi çalışanlarının olduğunu ve bu çalışanlar hakkındaki bilgileri tutan bir programa ihtiyacımız olduğunu varsayalım. 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 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. Her tip çalışan için ayrı bir structure 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 structure’ı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 “structure” tanımlamak olacaktır.

VERİLER ARASI İLİŞKİLERİN C’DE İFADESİ - 2 // Iliskili verilerin C’de ifade edilmesine ornek: struct isci_ucreti { float saat_ucreti; float calisma_suresi; } struct satis_elemani_ucreti float calisma_suresi; float komisyon; float satis_miktari; } struct yonetici_ucreti { float haftalik_ucret; } 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; };

VERİLER ARASI İLİŞKİLERİN C’DE İFADESİ - 3 // Iliskili 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; case YONETICI: return emp->haftalik_ucretli.haftalik_ucret; // ... }; }

VERİLER ARASI İLİŞKİLERİN C++’DA İFADESİ - 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.

VERİLER ARASI İLİŞKİLERİN C++’DA İFADESİ - 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 alt-sınıfı olarak tanımlayabiliriz.

VERİLER ARASI İLİŞKİLERİN C++’DA İFADESİ - 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 }; Örnek: // 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.

VERİLER ARASI İLİŞKİLERİN C++’DA İFADESİ - 4 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();

VERİLER ARASI İLİŞKİLERİN C++’DA İFADESİ - 5 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: << isimSoyle() << ‘\n’; }

VERİLER ARASI İLİŞKİLERİN C++’DA İFADESİ - 6 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 SatisElamani sınıfını UcretliCalisan sınıfından türetebiliriz: class SatisElemani : UcretliCalisan { public: SatisElemani( const char *nm ); void komisyonBelirle( float kom ); void satislariBelirle( float satislar ); private: float komisyon; float satisMiktari; }; Bir SatisElemani nesnesi Calisan ve UcretliCalisan bütün eleman sahalarını içerir. Bu üç sınıfın herhangi bir eleman fonksiyonu bir SatisElamani nesnesi için çağrılabilir. Ayrıca, UcretliCalisan 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.

VERİLER ARASI İLİŞKİLERİN C++’DA İFADESİ - 7 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 : Calisan { public: Yonetici( const char *nm ); void maasBelirle( float maas ); private: float haftalikMaas; }; Üç 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 SatisElemani

TEMEL SINIFIN ELEMANLARINI YENİDEN TANIMLAMA - 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; } 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 SatisElermani::odemeHesapla() const { return ucret * saat + komisyon * satisMiktari; //Error }

TEMEL SINIFIN ELEMANLARINI YENİDEN TANIMLAMA - 2 Üst sınıfın açık korumalı bir elemanı fonksiyonunu çağırmalıyız. Fakat, bu da sorunu çözmeyecektir: float SatisElermani::odemeHesapla() const { return odemeHesapla() + komisyon * satisMiktari; } Yukarıdaki fonksiyondaki (semantik) sorunu tespit ediniz.

TEMEL SINIFIN ELEMANLARINI YENİDEN TANIMLAMA - 3 Derleyici odemeHesapla ifadesiyle SatisElemani sınıfının ilgili fonksiyonunun çağrıldığını varsayacak ve bu da sonsuz öz-yinelemeye yol açacaktır. Üst-sınıfın fonksiyonuna erişmek için kapsam çözümleme operatörünü (::) kullanmak gerekecektir: float SatisElermani::odemeHesapla() const { return UcretliCalisan::odemeHesapla() + komisyon * satisMiktari; }

TEMEL SINIFIN ELEMANLARINI YENİDEN TANIMLAMA - 4 Ö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: SatisElermani satici( “oya ozsoy” ); 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’;

TEMEL SINIFIN ELEMANLARINI YENİDEN TANIMLAMA - 5 Yonetici sınıfı için de bir odemeHesapla fonksiyonu tanımlayabiliriz: float UcretliCalisan::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.

Temel ve Türetilmiş Sınıflar Arasında Dönüşüm - 1 C++ örtülü 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

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 = &yonetici;

Erişim Kuralları 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 dışarıdan hiçbir şekilde erişilemez. 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 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.

Erişim Kuralları - 2 #include <iostream> using namespace std; class Personel {public: Personel(){ cout << “Yapici Fonk.–Personel!\n”; } ~Personel(){cout << “Yikici Fonk.-Personel!\n”; }}; class Akademik : private Personel Akademik() {cout << “Yapici Fonk.–Akademik!\n”; } ~Akademik(){cout << “Yikici Fonk.–Akademik!\n”; }}; class Idari : private Personel Idari() {cout << “Yapici Fonk.–Idari!\n”; } ~Idari() {cout << “Yikici Fonk.–Idari!\n”; }}; class ArasGor : public Akademik { public: ArasGor() {cout << “Yapici Fonk.-ArasGor!\n”; } ~ArasGor(){cout << “Yikici Fonk.–ArasGor!\n”; }}; class OgrGor : public Akademik OgrGor() { cout << “Yapici Fonk.–OgrGor!\n”; } ~OgrGor() {cout << “Yikici Fonk.–OgrGor!\n”; }}; int main() { OgrGor servetSenyucel; cout << “MAIN!”; return 0; }

Erişim Kuralları - 3 Aşağıdaki ifadeleri Doğru veya Yanlış olarak sınıflayınız: Akademik-Personel sınıfından Personel sınıfının private elemanlarına erişilemez. Akademik-Personel 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 Akademik-Personel sınıfının private elemanlarına erişilemez. Araştırma-Görevlisi sınıfından Akademik-Personel 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ı, Akademik-Personel sınıfının public ve protected elemanlarına erişemeyecekti.

KALITIM VE YAPICI / YIKICI FONKSİYONLAR 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?

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. Yapici Fonk.-Personel! Yapici Fonk.-Akademik! Yapici Fonk.-OgrGor! MAIN! Yikici Fonk.-OgrGor! Yikici Fonk.-Akademik! Yikici Fonk.-Personel!

Çoklu kalıtım söz diziminin genel formatı: 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 (tartışmalı) son 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 };

Çoklu Kalıtım - 2 #include <iostream> using namespace std; class Personel {public: Personel(){ cout << “Yapici Fonk.–Personel!\n”; } ~Personel(){cout << “Yikici Fonk.-Personel!\n”; }}; class Akademik : public Personel Akademik() {cout << “Yapici Fonk.–Akademik!\n”; } ~Akademik(){cout << “Yikici Fonk.–Akademik!\n”; }}; class Idari : public Personel Idari() {cout << “Yapici Fonk.–Idari!\n”; } ~Idari() {cout << “Yikici Fonk.–Idari!\n”; }}; class B_Baskan : public Akademik, public Idari { public: B_Baskan() {cout << “Yapici Fonk.-B_Baskan!\n”; } ~B_Baskan(){cout<<“Yikici Fonk.–B_Baskan!\n”; }}; int main() { Akademik akademik1; Idari idari1; B_Baskan baskan; return 0; }

Çoklu Kalıtım - 3 Program Çıktısı: Yapıcı Fonk.-Personel Yapıcı Fonk.-Akademik Yapıcı Fonk.-Idari Yapıcı Fonk.-B_Baskan . . .

Çoklu Kalıtım - 4 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öz dizimde 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 << “Yapici Fonk.–Personel!\n”; ... }}; class Akademik : public virtual Personel Akademik() {cout << “Yapici Fonk.–Akademik!\n”; } class Idari : public virtual Personel Idari() {cout << “Yapici Fonk.–Idari!\n”; } class B_Baskan : public Akademik, public Idari { public: B_Baskan() {cout << “Yapici Fonk.-B_Baskan!\n”; } int main() { B_Baskan baskan; return 0; }

Çoklu Kalıtım - 4 Program Çıktısı: Yapıcı Fonk.-Personel Yapıcı Fonk.-Akademik Yapıcı Fonk.-Idari Yapıcı Fonk.-B_Baskan . . .

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.

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 türetilmis : temel { int j; 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; }