24 Aralık 2012 Pazartesi

ABSTRACT CLASS(SOYUT SINIF)

Kalıtımı(inheritance) programımızda kullanmışsak her zaman ana sınıfı doğrudan kullanmak zorunda değiliz.Yani bir arayüz gibi de kullanabiliriz.İşte abstract class yapısı bunu sağlıyor.Bir sınıfı abastract yapmak için ,sınıfın bir metodunun başına virtual kelimesi ekleyip 0(sıfır)' a eşitlemek yeterli olacaktır.Abstract sınıf için bir tane fonksiyonu  sıfıra eşitlemek yeterlidir.Sıfıra eşitlenen fonksiyon ise pure virtual function adını alır.Bu fonksiyonlar için tanımlama yapılmaz.Bu ,artık o sınıftan nesne oluşturamayacağınız anlamına gelmektedir.
Örneğimize geçmeden önce pure virtual destructordan bahsetmek istiyorum.Bunu destructorın başına virtual kelimesini getirerek yapıyoruz.Amaç ise destructoru pure virtual destructor olan ana sınıfımızdan oluşturulan bir pointer silinirken önce işaret ettiği nesnenin destructorı,çağrılır,sonrada kendi destructorı.

İşte basit bir örnek...
#include<iostream>

using namespace std;

class Base
{
public:
Base()
{
cout<<"Constructor of Base"<<endl;
}
virtual void f()=0; // f() fonksunu pure virtual functiondur.
void g()
{
cout<<"Base::g()"<<endl;
}
virtual ~Base() // Destructorda virtual tanımlanmıştır.
{
cout<<"~Base()"<<endl;
}
};

class Derived:public Base
{
public:
Derived()
{
cout<<"Contructor of Derived"<<endl;
}
void f()
{
cout<<"Derived::f()"<<endl;
}
virtual ~Derived()
{
cout<<"~Derived()"<<endl;
}

};

int main()
{
//Base b; hatalı kullanım çünkü Base abstractır ve abstract sınıftan nesne oluşturulamaz.
Base *ptr; //Base tipinde pointer oluşturdum.
ptr=new Derived;  // ptr pointerı Derivedden oluşturulan nesnenin adresini işaret eder.
ptr->f(); //Derived::f() çağrılır.
ptr->g();// Derivedda olmadığı için Base deki g() çağrılır.
delete ptr;
system("pause");
return 0;

}

Program çıktısı şu şekilde olur...

Hiç yorum yok:

Yorum Gönder