- C++ sanal işlevi, türetilmiş bir sınıfta yeniden tanımladığınız temel sınıfta bir üye işlevdir. Virtual anahtar sözcüğü kullanılarak bildirilir.
- Derleyiciye işlev üzerinde dinamik bağlantı veya geç bağlama gerçekleştirmesini söylemek için kullanılır.
- Farklı sınıflardaki tüm nesnelere atıfta bulunmak için tek işaretçiyi kullanma zorunluluğu vardır. Böylece, türetilmiş tüm nesnelere atıfta bulunan temel sınıfa yönelik işaretçiyi yaratırız. Ancak temel sınıf işaretçisi türetilmiş sınıf nesnesinin adresini içerdiğinde her zaman temel sınıf işlevini yürütür. Bu sorun yalnızca 'sanal' işlevi kullanılarak çözülebilir.
- 'Sanal', bir işlevin normal bildiriminden önceki bir anahtar kelimedir.
- İşlev sanal hale getirildiğinde, C++, temel sınıf işaretçisinin işaret ettiği nesnenin türüne göre çalışma zamanında hangi işlevin çağrılacağını belirler.
Geç bağlama veya Dinamik bağlantı
Geç bağlamada işlev çağrısı çalışma zamanı sırasında çözümlenir. Bu nedenle derleyici çalışma zamanında nesnenin türünü belirler ve ardından işlev çağrısını bağlar.
Sanal Fonksiyon Kuralları
Java'da nesne eşitliği
- Sanal işlevler bir sınıfın üyesi olmalıdır.
- Sanal işlevler statik üyeler olamaz.
- Nesne işaretçileri aracılığıyla bunlara erişilir.
- Başka bir sınıftan arkadaş olabilirler.
- Kullanılmasa bile temel sınıfta bir sanal işlevin tanımlanması gerekir.
- Temel sınıfın sanal fonksiyonunun ve türetilmiş tüm sınıfların prototipleri aynı olmalıdır. İki işlev aynı ada sahip ancak farklı prototiplere sahipse, C++ bunları aşırı yüklenmiş işlevler olarak kabul edecektir.
- Sanal bir kurucumuz olamaz ama sanal bir yıkıcımız olabilir
- Virtual anahtar sözcüğünü kullanmadığımız durumu düşünün.
#include using namespace std; class A { int x=5; public: void display() { std::cout << 'Value of x is : ' << x<<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>
Çıktı:
Value of x is : 5
Yukarıdaki örnekte *a temel sınıf işaretçisidir. İşaretçi yalnızca temel sınıf üyelerine erişebilir ancak türetilmiş sınıfın üyelerine erişemez. C++ temel işaretçinin temel sınıftan türetilen herhangi bir nesneyi işaret etmesine izin vermesine rağmen, türetilmiş sınıfın üyelerine doğrudan erişemez. Bu nedenle temel işaretçinin türetilmiş sınıfın üyelerine erişmesini sağlayan sanal fonksiyona ihtiyaç vardır.
C++ sanal işlevi Örnek
Bir programda türetilmiş sınıfı çağırmak için kullanılan C++ sanal fonksiyonunun basit örneğini görelim.
#include { public: virtual void display() { cout << 'Base class is invoked'<<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>
Çıktı:
Derived Class is invoked
Saf Sanal İşlev
- Herhangi bir görevi gerçekleştirmek için sanal bir işlev kullanılmaz. Yalnızca yer tutucu görevi görür.
- Fonksiyonun tanımı olmadığında bu fonksiyona '' denir. hiçbir şey yapma ' işlev.
- ' hiçbir şey yapma ' işlevi bir olarak bilinir saf sanal işlev . Saf bir sanal işlev, temel sınıfa göre hiçbir tanımı olmayan, temel sınıfta bildirilen bir işlevdir.
- Saf sanal işlevi içeren bir sınıf, kendi nesnelerini bildirmek için kullanılamaz; bu tür sınıflar, soyut temel sınıflar olarak bilinir.
- Temel sınıfın temel amacı, türetilmiş sınıflara özellikleri sağlamak ve çalışma zamanı polimorfizmini elde etmek için kullanılan temel işaretçiyi oluşturmaktır.
Saf sanal işlev şu şekilde tanımlanabilir:
virtual void display() = 0;
Basit bir örnek görelim:
jpa vs hazırda bekletme
#include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout << 'Derived class is derived from the base class.' <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>
Yukarıdaki örnekte temel sınıf saf sanal işlevi içermektedir. Bu nedenle temel sınıf soyut bir temel sınıftır. Temel sınıfın nesnesini oluşturamıyoruz.