Program içerisinde sanal fonksiyon şu biçimlerde çağırılabilir:
Â
1. Türemiş sınıf nesnesinin adresinin açık bir biçimde taban sınıf nesnesine atanması yoluyla
Â
void main(void)
{
   B z(10, 20);
   A *p;
Â
   p = &z;
   p -> Disp();
}
Â
2. Fonksiyonun parametre değişkeni taban sınıf türünden bir göstericidir. Fonksiyon da türemiş sınıf nesnesinin adresiyle çağırılır. Bu gösterici yoluyla sanal fonksiyon çağırılabilir.
Â
void fonk(A *p)
{
   p -> Disp();
}
Â
void main(void)
{
   B n(10, 20);
Â
   fonk(&n);
}
Â
3. Taban sınıf türünden bir referans türemiş sınıf türünden nesneyle ilk değer verilerek tanımlanır. Bu referans yoluyla sanal fonksiyon çağırılabilir. Bu durumda türemiş sınıfa ilişkin sanal fonksiyon çağırılacaktır.
Â
void main(void)
{
   B n(10, 20);
   A &r = n;
Â
   r.Disp();
}
Â
4. Fonksiyonun parametre değişkeni taban sınıf türünden bir referans olur. Fonksiyon da türemiş sınıfın nesnesinin kendisiyle çağırılır. Fonksiyon içerisinde bu referans yoluyla türemiş sınıfa ilişkin sanal fonksiyon çağırılır.
Â
void fonk(A &r)
{
   r.Disp();
}
Â
void main(void)
{
   B n(10, 20);
Â
   fonk(n);
}
Â
5. Türemiş sınıf türünden bir nesne ile taban sınıfa ilişkin bir üye fonksiyonu çağırılırsa, bu üye fonksiyon içerisinde de sanal fonksiyon çağırılırsa üye fonksiyon hangi sınıfa ilişkin nesne ile çağırılmışsa o sınıfa ilişkin sanal fonksiyon çağırılır.
Â
void A::fonk(void)
{
   Disp();
}
Â
void main(void)
{
   B n(10, 20);
Â
   n.fonk();
}
Â
Tabii üye fonksiyon içerisinde çağırma işlemi çözünürlük operatörü ve sınıf ismi beliritilerek yapılırsa sanallık özelliği kalmaz.
Â
Taban sınıf sanal fonksiyona sahip olduğu halde türemiş sınıf sanal fonksiyona sahip olmayabilir. Yani türemiş sınıf için sanal fonksiyonun tanımlanması zorunlu değildir. Sanal fonksiyona sahip olmayan türemiş sınıfa ilişkin bir sınıf nesnesinin adresi taban sınıf göstericisine atanır ve bu gösterici yoluyla sanal fonksiyon çağırılırsa türemiş sınıfın sanal fonksiyona sahip ilk taban sınıfının sanal fonksiyonu çağırılır.
Â
Sanal fonksiyon çağırılabilmesi için türetme biçiminin public olması gerekir. Bir sanal fonksiyon çağırıldığında gerçekte çağırılacak olan türemiş sınıfın sanal fonksiyonu sınıfın herhangi bir bölümünde olabilir. Ancak çağırılma ifadesindeki nesneye ilişkin sınıfın sanal fonksiyonu public bölümde olmak zorundadır. Örneğin :
Â
A *p;
C n;
p = &n;
p -> fonk();
Â
Burada fonk sanal bir fonksiyon olsun, gerçekte çağırılacak olan fonk C sınıfının fonksiyonudur. C sınıfının fonk sanal fonksiyonu sınıfın herhangi bir bölümünde bildirilmiÅŸ olabilir, ancak çağırmanın mümkün olabilmesi için A sınıfının fonk sanal fonksiyonunun public bölümde bildirilmiÅŸ olması gerekir.Â
Yorumlar
Yorum Yok
Yorumunuzu Ekleyin
Yorum eklemek için giris yapmalısınız.