24 Şubat 2018 Cumartesi

VİRTUAL (Sanal Fonksiyon) NEDİR?

Sanal Fonksiyona neden ihtiyaç duyulur ?

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çıklayayı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 değil mi ? 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. Lafı çok uzatmadan örnek kodumuz ile olayı biraz somutlaştırayı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 dortgen 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.
Şimdilik bu konuda söylenecekler bu kadar bir sonraki başlığımız olan Saf Sanal Fonksiyonlara değinerek yazımı tamamlıyorum.
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. Bu söylediklerim birer kuraldır ve eksikliğinde derleyici koşma hatasına sebep olurlar.

Hiç yorum yok:

Yorum Gönder

OVERLOADİNG

C/C++ Operatorlerin Aşırı Yüklenmesi (Operator Overloading) C++’ da +,-,*,!,++ gibi operatörler fonksiyonlar yazılarak bu operatörlere ...