C++ Virtual nedir? Ne işe yarar?

Sanal fonksiyonları çok biçimli programlama tekniği (polymorphism) ile kullanılır. Bir sınıfın fonksiyonunun miras alan diğer sınıflar tarafından kullanılmasını sağlamak için virtual anahtar kelimesiyle tanımlarız. Bunun nedenini bir örnek ile açıklayalım. Diyelim ki bir kare sınıfımız var. Bu sınıf için alan hesaplayabiliriz, çizim yaptırabiliriz , çevre hesaplayabiliriz. Diğer bir sınıf olan üçgen ise kare’den miras alsın. Üçgen içinde aynı fonksiyonları kullanabiliriz.Bunu yapabilmemiz için kare sınıfımızdaki fonksiyonlarımızı virtual anahtar kelimesiyle deklare etmemiz gerekir yani prototiplerini virtual ön eki ile yazarız. Örnek  ile olayı biraz somutlaştıralım.
class dortgen
{
    public:
    virtual int alan(int taban, int yukseklik){
       return taban*yukseklik;
    }
    int cevre(int taban, int yukseklik){
       return 2*(taban+yukseklik);
    }
};
class ucgen : public dortgen
{
    public:
    int alan(int taban, int yukseklik){
       return (taban*yukseklik)/2;
    }
};
Yukarıdaki kodu ile anlatıldığı gibi dörtgen sınıfımızın virtual fonksiyonu olan alan ucgen sınıfımızda da aynı isim ile farklı işlevi gerçekleştirecek şekilde tanımlanabilir.Aşağıdaki örnek kodumuzu inceleyelim.
int main()
{
    dortgen *ptr; // ptr temel sınıfa ait bir pointer
    ucgen nesne1;   //nesne1'de türemiş sınıfa ait bir nesne
ptr = &nesne1; // Temel sınıfa ait bir pointera türemiş sınıfın adresini atayabiliriz
    ptr->alan();   // Ekranda hangi şeklin alanı hesaplandı ?
return 0;
}
Yukarıdaki kodu uygun şekilde ekleyip çalıştırdığımızda sınıflarımızdan hangisi için alan hesaplaması yaptı ? Program içinde temel sınıfımız olan dortgen'den oluşturduğumuz bir pointer tipli değişkene türetilmiş sınıfımızın adresini verdik. Sonra bu değişken ile alan() fonksiyonumuza ulaştık. Pointerımız programın o kısmında ucgeni gösterdiği için ucgen alanı hesaplanacaktır. Bu örnek genişleterek farklı kullanım alanları oluşturulabilir.Saf sanal fonksiyonlar kullanım olarak aynı şekildedir. Fakat temel sınıfımız içerisinde sadece virtual fonksiyonlarımız vardır. Bu sınıfa soyut sınıf denir.Soyut sınıfımızdan bir nesne türetmemiz mümkün değildir. Aynı zamanda soyut sınıftan miras alan tüm sınıflar virtual tanımlanmış olan fonksiyonlara sahip olmalıdır. Bunlar birer kuraldır ve eksikliğinde derleyici koşma hatasına sebep olurlar.

Yorumlar

Yorum Gönder

Bu blogdaki popüler yayınlar

GCC (GNU COMPİLER COLLECTİON) NEDİR ?

Process ve Thread Arasındaki Farklar

String Fonksiyonlarının Kullanımı