NESNEYE YÖNELİK PROGRAMLAMA

Benzer belgeler
NESNEYE YÖNELİK PROGRAMLAMA

1 PROGRAMLAMAYA GİRİŞ

NESNEYE YÖNELİK PROGRAMLAMA

C++ Dersi: Nesne Tabanlı Programlama

C++ Dersi: Nesne Tabanlı Programlama

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

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

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

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

C++ Dersi: Nesne Tabanlı Programlama

C++ Dersi: Nesne Tabanlı Programlama

C++ Dersi: Nesne Tabanlı Programlama

Kalıtım (Inheritance)

C++ Dersi: Nesne Tabanlı Programlama

C++ Dersi: Nesne Tabanlı Programlama

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

BTEP243 Ders 3. class Yazım Kuralı:

NESNEYE YÖNELİK PROGRAMLAMA SINIFLAR

Operatörlerin Aşırı Yüklenmesi

NESNE MODELLERİ : SINIFLAR

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

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

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

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

C++ ile Nesneye Dayalı Programlama

Veri Yapıları Lab Notları 1

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

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

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

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

Nesneye Yönelik Programlama (OOP) 7.Hafta

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

Göstericiler (Pointers)

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

BİLG Dr. Mustafa T. Babagil 1

Operatörlere Yeni İşlevler Yüklenmesi (Operator Overloading)

HSancak Nesne Tabanlı Programlama I Ders Notları

Çok Şekillilik (Polymorphism)

Pointer Kavramı. Veri Yapıları

8. İŞARETCİLER (POINTERS)

Operatörlere İşlev Yükleme

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

NESNEYE YÖNELİK PROGRAMLAMA

Nesne Yönelimli Programlama ve Kalıtım

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

Nesne Yönelimli Programlama

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

BİL-141 Bilgisayar Programlama I (Java)

Kurucu Fonksiyonlar (Constructors)

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

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

Örnek1: #include <iostream> #include <string> using namespace std;

NESNEYE YÖNELİK PROGRAMLAMA Temel Kavramlar

const objects & const member functions

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

Nesne Tabanlı Programlama

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

C++ Dersi: Nesne Tabanlı Programlama

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

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

11- FONKSİYONLAR (FUNCTIONS)

Pros and Cons of Pointers. Pointers. Avantajlar. Dezavantajlar

Ders 8: Metotlar. barisgokce.com

Nesneye Dayalı Programlama Laboratuvarı

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

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

C++0x - Sağ Taraf Değerine Bağlanan Referanslar (Rvalue References)

YZM 2105 Nesneye Yönelik Programlama

C++ Operatörler (Operators)

Lambda İfadeleri (Lambda Expressions)

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

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

ÜNİTE. NESNE TABANLI PROGRAMLAMA I Okt. Mustafa AKBUĞA İÇİNDEKİLER HEDEFLER METOTLAR

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

işlemler bittikten sonra dosyaların kapatılması uygun olacaktır. Bunun için, fclose(fin);

Algoritma Geliştirme ve Veri Yapıları 2 Veri Modelleri. Mustafa Kemal Üniversitesi

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

public static int Toplam int x, int y

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

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

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

Deney 7: Fonksiyon Tanımlama ve Parametre Aktarım Yöntemleri

Struct VE GÖSTERİCİLER FONKSİYONLARDA STRUCT KULLANIMI Programlama dilleri hafta -

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

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

Diziler (Arrays) Çok Boyutlu Diziler

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

Object-Oriented Programming Laboratuvar 11

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

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

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 7. Bölüm Metot Tanımlama ve Kullanma

C++ Giriş. C++ Programlama Dili

BİL-142 Bilgisayar Programlama II

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

Sunum İçeriği. Programlamaya Giriş

İsimler ve Kapsam. 24 Şubat Programlama Dilleri - Pamukkale Üniversitesi 1

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

Bölüm 11. Soyut veri tipleri ve kapsülleme kavramları ISBN

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

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

Transkript:

NESNEYE YÖNELİK PROGRAMLAMA SANAL FONKSİYONLAR VE ÇOK BİÇİMLİLİK Özlem AYDIN Trakya Üniversitesi Bilgisayar Mühendisliği Bölümü

GİRİŞ C++, hem derleyici-zamanlı hem de çalışmazamanlı çok biçimliliği destekler. Derleyici-zamanlı çok biçimlilik fonksiyonların veya operatörlerin aşırı yüklenmesi yoluyla gerçekleştirilir. Çalışma-zamanlı çok biçimlilik ise kalıtım ve sanal fonksiyon mekanizmaları aracılığıyla gerçekleştirilir.

SINIF HİYERARŞİSİ 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ı

TEMEL VE TÜRETİLMİŞ SINIFLAR ARASINDA DÖNÜŞÜM - 1 Bir satış elemanının aynı zamanda bir ücretli çalışan olması nedeniyle, bir UcretliCalisan nesnesine ihtiyaç duyduğumuz zaman bir SatisElemani nesnesi kullanabiliyor olmamız anlamlı olacaktır. Bu tarz bir ilişkiyi desteklemek için, C++ örtük olarak bir türetilmiş sınıf nesnesini bir temel sınıf nesnesine dönüştürür: UcretliCalisan isci; SatisElemani satici( Ali Uzun ); isci = satici; //SatisElemani => UcretliCalisan //turetilmis => temel Ters yönlü bir atama kabul edilmeyecektir: satici = isci; // Error; cannot convert

TEMEL VE TÜRETİLMİŞ SINIFLAR ARASINDA DÖNÜŞÜM - 2 Benzer şekilde, türetilmiş bir sınıf nesnesine işaret eden bir işaretçi örtük olarak bir temel sınıf nesnesine işaret eden bir işaretçiye dönüştürülebilir: Calisan *cptr; UcretliCalisan isci( Oya Kiper ); SatisElemani satici( Ali Uzun ); Yonetici mudur( Mehmet Demir ); cptr = &isci; //UcretliCalisan * => Calisan * cptr = &satici; //SatisElemani * => Calisan * cptr = &mudur;//yonetici * => Calisan *

TEMEL VE TÜRETİLMİŞ SINIFLAR ARASINDA DÖNÜŞÜM - 3 Bir nesneye işaretçi ile referansta bulunulduğu zaman hangi eleman fonksiyonun çağrılacağını işaretçinin tipi belirler. Eğer bir türetilmiş sınıf nesnesine bir temel sınıf işaretçisi ile işaret ederseniz yalnızca temel sınıfa ait fonksiyonları çağırabilirsiniz: SatisElemani satici( Ali Uzun ); SatisElemani *sptr; UcretliCalisan *uptr; sptr = &satici; uptr = &satici; uptr->surebelirle(40.0); //UcretliCalisan sptr->ucretbelirle(6.0); //UcretliCalisan uptr->satislaribelirle(1000.0); //Error sptr->satislaribelirle(1000.0); //SatisElemani sptr->komisyonbelirle(0.05); //SatisElemani float taban, toplam; taban = uptr->odemehesapla(); //UcretliCalisan toplam = sptr->odemehesapla(); //SatisElemani

TEMEL VE TÜRETİLMİŞ SINIFLAR ARASINDA DÖNÜŞÜM - 4 Türetilmiş bir sınıf işaretçisinin bir temel sınıf işaretçisine dönüştürülebilmesi, örneğin, bir çalışanlar topluluğu oluşturmamıza imkan verebilir: class PersonelListesi { public: PersonelListesi(); ekle(calisan *yeniper); //

TEMEL VE TÜRETİLMİŞ SINIFLAR ARASINDA DÖNÜŞÜM - 5 PersonelListesi bolum1; UcretliCalisan *ucretliptr; SatisElemani *saticiptr; Yonetici *yoneticiptr; // Yeni nesneler için bellek talebi ucretliptr = new UcretliCalisan( Ayse Suer ); saticiptr = new SatisElemani( Ali Demir ); yoneticiptr = new Yonetici( Mehmet Yilmaz ); // Listeye ekleme bolum1.ekle( ucretliptr ); bolum1.ekle( saticiptr ); bolum1.ekle( yoneticiptr ); Buradaki sorun her nesne yalnızca genel bir Calisan düzeyinde işleme tabi olabilir.

SANAL FONKSİYONLAR (sentaks) Sanal fonksiyon temel bir sınıfta bildirimi yapılan fakat türetilmiş bir sınıfta yeniden tanımlanmasını beklediğimiz bir eleman fonksiyondur. Bir sanal fonksiyon bildirimi temel sınıftaki eleman fonksiyon bildiriminin öncesine virtual anahtar sözcüğünü yerleştirerek gerçekleştirilir. Global fonksiyonlar, arkadaş fonksiyonlar ve statik eleman fonksiyonlar sanal fonksiyon olamazlar. virtual anahtar sözcüğü, türetilmiş sınıflardaki bildirimler ya da sınıf dışında tanımlanmış sanal fonksiyonlar için gerekli değildir; bir sanal fonksiyonun türetilmiş sınıflardaki versiyonları örtük olarak sanal bildirimlidirler. Türetilmiş sınıftaki sanal fonksiyon bildiriminde ya da sınıf dışındaki sanal fonksiyon tanımında virtual anahtar sözcüğünü kullanmak derleyici tarafından bir hata olarak yorumlanmaz.

SANAL FONKSİYONLAR (semantik) Normal bir erişimde, sanal fonksiyonlar diğer bütün sınıfa ait eleman fonksiyonlar gibi davranırlar. Fakat, sanal fonksiyonları önemli kılan ve çalışma zamanlı çok biçimliliği desteklemesini sağlayan bir işaretçi ya da referans ile erişilmeleri halindeki davranışlarıdır. Eğer bir temel sınıf işaretçisi ya da referansı bu temel sınıftan türetilmiş bir sınıfın nesnesine işaret ediyorsa / referansta bulunuyorsa, sıradan fonksiyonlarda olmasını beklediğimizin tersine, C++ sanal bir fonksiyonun hangi versiyonunu çağıracağına nesneye bakarak karar verir. Bu karar çalışma zamanında gerçekleştirilir. Dolayısıyla, farklı nesnelere işaret edildiğinde / referansta bulunulduğunda fonksiyonun farklı versiyonları çalıştırılacaktır.

SANAL FONKSİYONLAR (örnek) //Sanal odemehesapla fonksiyonlu calisan sinif hiyerarsisi class Calisan Calisan( const char *nm ); char *isimsoyle() const; virtual float odemehesapla() const; virtual ~Calisan() {} private: char isim[30]; class UcretliCalisan : public Calisan UcretliCalisan( const char *nm ); void ucretbelirle( float ucrt ); void surebelirle( float st ); float odemehesapla() const; // sanal (ortuk) private: float ucret; float saat;

SANAL FONKSİYONLAR (örnek) class SatisElemani : public UcretliCalisan SatisElemani( const char *nm ); void komisyonbelirle( float kom ); void satislaribelirle( float satislar ); float odemehesapla() const; // sanal (ortuk) private: float komisyon; float satismiktari; class Yonetici : Calisan Yonetici( const char *nm ); void maasbelirle( float maas ); float odemehesapla() const; // sanal (ortuk) private: float haftalikmaas;

SANAL FONKSİYONLAR (örnek) Her sınıfın kendisine ait odemehesapla fonksiyonunun tanımı değişmeden kalabilir. Fakat, temel sınıfa eklenen odemehesapla fonksiyonu için bir tanım gerekmektedir: float Calisan::odemeHesapla() const { cout << Hesaplama islemi tanimlanmamis\n ; return 0; } Bu fonksiyon eğer salt bir Calisan nesnesi kullanıldığında ya da türetilmiş sınıflardan bir tanesi kendi odemehesapla fonksiyonunu tanımlamamış ise çağrılır.

SANAL FONKSİYONLAR (örnek) // Bir Calisan isaretcisi ile odemehesapla cagrimi Calisan *cptr; float ucret; cptr = &isci; ucret = cptr->odemehesapla(); //UcretliCalisan cptr = &satici; ucret = cptr->odemehesapla(); //SatisElemani cptr = &mudur; ucret = cptr->odemehesapla(); //Yonetici Eğer odemehesapla sanal bildirimli olmasaydı, her fonksiyon çağrımı, 0 değerini döndüren Calisan::odemeHesapla fonksiyonunu çalıştıracaktı. Fakat, verilen çağrımların aynı olmasına rağmen çalıştırılacak fonksiyonlar farklı olacaktır.

SANAL FONKSİYONLAR (örnek) #include <iostream> using namespace std; class temel virtual void sanalfonk() { cout << Temel sinif sanalfonk\n ;} class turetilmis1 : public temel void sanalfonk() { cout << Turetilmis sinif1 sanalfonk\n ;} class turetilmis2 : public temel void sanalfonk() { cout << Turetilmis sinif2 sanalfonk\n ;}

SANAL FONKSİYONLAR (örnek) int main() { temel *p, b; turetilmis1 d1; turetilmis2 d2; p = &b; p->sanalfonk(); p = &d1; p->sanalfonk(); p = &d2; p->sanalfonk(); } return 0; Program çıktısını belirleyiniz.

SANAL FONKSİYONLAR (örnek) Program çıktısı: Temel sinif sanalfonk Turetilmis sinif1 sanalfonk Turetilmis sinif2 sanalfonk Normal yolla sanal fonksiyon çağrımı: d2.sanalfonk(); // turetilmis2::sanalfonk

SANAL FONKSİYONLAR ve REFERANSLAR - 1 // Temel sinif referansi ile sanal fonksiyon erişimi #include <iostream> using namespace std; class temel virtual void sanalfonk() {cout << Temel sinif sanalfonk\n ;} class turetilmis1 : public temel void sanalfonk() {cout << Turetilmis sinif1 sanalfonk\n ;} class turetilmis2 : public temel void sanalfonk() {cout << Turetilmis sinif2 sanalfonk\n ;}

SANAL FONKSİYONLAR ve REFERANSLAR - 2 // Temel sinif referansini parametre alan fonksiyon void f(temel &r) { r.sanalfonk() ; } int main() { temel b; turetilmis1 d1; turetilmis2 d2; f(b); f(d1); f(d2); } return 0; Program çıktısını belirleyiniz.

SANALLIK KALITIMLA AKTARILIR - 1 Sanal bir fonksiyon kalıtıldığında, sanal doğası da kalıtılır: #include <iostream> using namespace std; class temel virtual void sanalfonk() {cout << Temel sinif sanalfonk\n ;} class turetilmis1 : public temel void sanalfonk() {cout << Turetilmis sinif1 sanalfonk\n ;} class turetilmis2 : public turetilmis1 void sanalfonk() {cout << Turetilmis sinif2 sanalfonk\n ;}

SANALLIK KALITIMLA AKTARILIR - 2 int main() { temel *p, b; turetilmis1 d1; turetilmis2 d2; p = &b; p->sanalfonk(); p = &d1; p->sanalfonk(); p = &d2; p->sanalfonk(); } return 0; Bu kez, turetilmis2 adlı sınıf temel adlı sınıftan değil turetilmis1 adlı sınıftan türetilmiştir ama sanalfonk yine sanal kalmıştır. Program çıktısını belirleyiniz.

SANAL FONKSİYONLAR HİYERARŞİKTİR - 1 Eğer türetilmiş bir sınıf sanal bir fonksiyonu yeniden tanımlamaz ise bu sınıfın bir nesnesi sanal fonksiyona erişmek istediğinde temel sınıf tarafından tanımlanan versiyon kullanılır: #include <iostream> using namespace std; class temel virtual void sanalfonk() {cout << Temel sinif sanalfonk\n ;} class turetilmis1 : public temel void sanalfonk() {cout << Turetilmis sinif1 sanalfonk\n ;} class turetilmis2 : public temel // sanalfonk() yeniden tanimlanmamis.

SANAL FONKSİYONLAR HİYERARŞİKTİR - 2 int main() { temel *p, b; turetilmis1 d1; turetilmis2 d2; p = &b; p->sanalfonk(); p = &d1; p->sanalfonk(); p = &d2; p->sanalfonk(); } return 0; Program çıktısını belirleyiniz.

SANAL FONKSİYONLAR HİYERARŞİKTİR - 3 Program çıktısı: Temel sinif sanalfonk Turetilmis sinif1 sanalfonk Temel sinif sanalfonk Yukarıdaki program genel bir kuralın özel bir durumunu örneklemektedir. Kalıtım, C++ da hiyerarşik olarak tanımlandığı için, sanal fonksiyonlar da hiyerarşik olmalıdır. Bu ise, eğer türetilmiş sınıf sanal fonksiyonu yeniden tanımlamış ise tersinden hiyerarşik sıralamada ilk yeniden tanımlanmış fonksiyonun kullanılacağı anlamına gelir (bkz. bir sonraki örnek).

SANAL FONKSİYONLAR HİYERARŞİKTİR - 4 #include <iostream> using namespace std; class temel virtual void sanalfonk() {cout << Temel sinif sanalfonk\n ;} class turetilmis1 : public temel void sanalfonk() {cout << Turetilmis sinif1 sanalfonk\n ;} class turetilmis2 : public turetilmis1 // sanalfonk() yeniden tanimlanmamis.

SANAL FONKSİYONLAR HİYERARŞİKTİR - 5 int main() { temel *p, b; turetilmis1 d1; turetilmis2 d2; } p = &b; p->sanalfonk(); p = &d1; p->sanalfonk(); p = &d2; p->sanalfonk(); return 0; Program çıktısını belirleyiniz.

SANAL FONKSİYONLAR HİYERARŞİKTİR - 6 Program çıktısı: Temel sinif sanalfonk Turetilmis sinif1 sanalfonk Turetilmis sinif1 sanalfonk

SAF SANAL FONKSİYONLAR - 1 Birçok durumda temel sınıftaki sanal fonksiyon için anlamlı bir tanım bulunmayabilir. Bu durumlarda saf sanal fonksiyonlar ( pure virtual functions ) kullanılır. Saf sanal fonksiyon temel sınıfta tanımı olmayan sanal fonksiyondur ve bildiriminin genel formu aşağıdaki gibidir: virtual tip fonksiyon-ismi(parametreler) = 0; Saf sanal fonksiyon türetilmiş bütün sınıflarda yeniden tanımlanmalıdır. Aksi, derleyici-zamanlı hataya yol açar. En az bir saf sanal fonksiyon içeren sınıfa soyut ( abstract ) sınıf denir. Soyut sınıflara ait nesne yaratılamaz ama soyut sınıflara işaret eden işaretçiler ya da referansta bulunan referanslar yaratılabilir.

SAF SANAL FONKSİYONLAR - 2 #include <iostream> using namespace std; class sayi { protected: int deger; public: void degerbelirle(int i) { deger = i;} virtual void goruntule() = 0; class hextip : public sayi void goruntule() {cout << hex << deger << \n ;} class destip : public sayi void goruntule() {cout << deger << \n ;} class okttip : public sayi void goruntule() {cout << oct << deger << \n ;}

SAF SANAL FONKSİYONLAR - 3 int main() { destip d; hextip h; okttip o; d.degerbelirle(20); d.goruntule(); // 20 h.degerbelirle(20); h.goruntule(); // 14 o.degerbelirle(20); o.goruntule(); // 24 } return 0;

SANAL YIKICI FONKSİYONLAR Problem: Dinamik olarak yaratılmış nesneleri delete operatörü ile yok etmek potansiyel bir problem kaynağıdır. Eğer delete bir temel sınıf işaretçisine uygulanıyorsa, işaretçi türetilmiş bir sınıfın nesnesini işaret ediyor bile olsa, derleyici temel sınıfın yıkıcı fonksiyonunu çağıracaktır. Çözüm: Bu sorun temel sınıfın yıkıcı fonksiyonunu sanal yaparak çözülür. Bu şeklide, türetilmiş sınıfların yıkıcı fonksiyonları da sanal yapılmış olacaktır ve böylelikle delete operatörü temel sınıf işaretçisine uygulandığında ilgili yıkıcı fonksiyon çağrılacaktır. İlke olarak sanal fonksiyon içeren bir sınıf yazıldığında, sanal bir yıkıcı fonksiyon da tanımlanmalıdır. Yıkıcı fonksiyonların aksine, yapıcı fonksiyonlar sanal olarak tanımlanamaz.

Kaynaklar Prof. Dr. Yılmaz Kılıçaslan, Nesneye Yönelik Programlama dersi sunumları C++ Temel Öğrenim Kılavuzu, Herbert Schildt, Alfa Basım Yayın Dağıtım, 2010.