Bir türemiş sınıf nesnesinin adresi taban sınıf göstericileriyel dolaştırılmış olabilir ve en sonunda sanal fonksiyon çağırılsa bile nesnenin orijinaline ilişkin sanal fonksiyon çağırılacaktır. peki derleyici bu olayı derleme zamanı sırasında belirleyebilir mi? Bu olayın derleme sırasında tespit edilmesi mümkün değildir. Gerçekte hangi sanal fonksiyonun çağırlıacağını belirlemek ancak runtime sırasında kurulacak bir mekanizmayla mümkün olabilir. Bu mekanizmanın runtime sırasında kurulmasına ingilizce late binding denilmektedir.
Â
Â
Â
class A {
   public:
       virtual void fonk1(void);
       virtual void fonk2(void);
};
Â
class B : public A {
   public:
       virtual void fonk1(void);
       virtual void fonk2(void);
};
Â
class C : public B {
       virtual void fonk1(void);
       virtual void fonk2(void);
};
Â
void sample(B *p)
{
   sample2(p);
}
Â
void sample2(A *p)
{
   p -> fonk1();
}
Â
void main(void)
{
   C x;
   B *t;
Â
   t = &x;
   sample(t);/*C’nin sanal fonksiyonu çağırılacak*/
}
Â
A Sınıfının Sanal Fonksiyon Tablosu
|
Sıra No
|
Adres
|
|
1
|
&A::fonk1()
|
|
2
|
&A::fonk2()
|
Â
Â
B Sınıfının Sanal Fonksiyon Tablosu
|
Sıra No
|
Adres
|
|
1
|
&B::fonk1()
|
|
2
|
&B::fonk2()
|
Â
Â
C Sınıfının Sanal Fonksiyon Tablosu
|
Sıra No
|
Adres
|
|
1
|
&C::fonk1()
|
|
2
|
&C::fonk2()
|
Â
Â
Derleyici bu mekanizmayı kurabilmek için her sınıfa ilişkin bir sanal fonksiyon tablosu yaratır. Bu sanal fonksiyon tablolarında ilgili sınıfın sanal fonksiyonlarının adresleri bulunur. Sanal fonksiyona sahip bir sınıfa ilişkin bir nesne tanımlandığında o nesne için bir gizli gösterici kadar daha fazla yer ayrılır. Bu gizli göstericide nesne hangi sınıfa ilişkinse o sınıfa ilişkin sanal fonksiyona ilişkin tablonun adresi tutulur. Bu gizli göstericinin nesnenin neresinde tutulduğu standart olarak belirlenmemiştir. Ancak nesnenin en düşük anlamlı adreslerinde genel olarak tutulmaktadır. Bu durumda bir sanal fonksiyon çağırıldığında aşağı seviyeli şu işlemler yapılır:
Â
1. Sanal fonksiyon tablo göstericisi alınır ve tablonun yeri bulunur.
2. Sanal fonksiyon tablosunda ilgili sanal fonksiyonun adresi bulunur.
3. Sanal fonksiyon çağırılır.
Â
Sanal fonksiyon çağırmanın yer ve zaman maliyeti söz konusudur. Çünkü sanal fonksiyon tabloları ve nesne içerisindeki sanal fonksiyon tablo göstericisi ek yer kaplamaktadır. Ayrıca tablolara bakarak sanal fonksiyon çağırıldığı için ek makina komutlarına gereksinim duyulur. Bu da zaman kaybına sebep olur.Â
Yorumlar
Yorum Yok
Yorumunuzu Ekleyin
Yorum eklemek için giris yapmalısınız.