Sanal İşlev Nedir?

Sanal işlev, bir üst sınıfta tanımlanan, bir alt sınıfta tam bir sınıf tanımına sahip olması için bulunması gereken bir işlevdir. Sanal işlevler, "sanal" anahtar sözcüğü kullanılarak en çok C ++ 'da görülen sanal kalıtım adı verilen nesne yönelimli bir programlama paradigmasına dayanır. Sanal bir işlevi tanımlamak için iki sınıf gereklidir, bir üst sınıf ve bir alt sınıf. Üst sınıf, işlevin ilk kez bildirildiği ve muhtemelen tanımlandığı yerdir. Alt sınıf, fonksiyonun üst sınıfta tanımlanıp tanımlanmadığına bağlı olarak, fonksiyonun tanımlandığı - veya geçersiz kılındığı yerdir.

Sanal işlev iki yoldan biriyle tanımlanabilir. Birincisi, boş bir gövdeye sahip olduğu ve hiçbir şey yapmadığı bir saplama olarak tanımlanabilir. İkincisi, üst sınıfın başlık dosyasında NULL olarak tanımlandığı saf bir sanal işlev olarak tanımlanabilir.

Her iki yöntemin de avantajları ve dezavantajları vardır. Bir işlevi bir saplama olarak tanımlamak, hiçbir şey yapmasa bile, tüm alt sınıfların bir uygulamasına sahip olmasını sağlar. Bununla birlikte, biri işlevi geçersiz kılmayı ve onu bir alt sınıfta doğru şekilde uygulamayı unutursa, bunu işaret edecek herhangi bir hata veya uyarı görünmeyecektir. Öte yandan, saf bir sanal işlev tanımlamak, her bir alt sınıfın kendi işlev tanımına sahip olmasını gerektirir ve böyle değilse hatalar ortaya çıkar.

Ancak sanal işlevler, sanal olmayan işlevlerle aynı devralma kurallarına tabidir, bu nedenle ikiden fazla düzeydeki devralma hiyerarşileri, sanal işlevlerin açık tanımlarını gerektirmeyebilir. Örneğin, B sınıfı alt sınıfa uygulanan sanal bir işlev ilan eden bir A sınıfı kabul edilebilir. B sınıfı kendi C sınıfı bir alt sınıfa sahiptir. C sınıfı, A sınıfının işlevinin açık bir tanımını gerektirmez, çünkü devralınır Sınıf B'deki tanım gerekirse, C sınıfı, B sınıfının işlevini geçersiz kılabilir ya da aynı zamanda onu çağırırken B sınıfının işlevini geçersiz kılabilir.

Diğer uçta ise, sanal işlevlerin o alt sınıfta sanal olarak bildirildikleri takdirde bir alt sınıfta tanımlanması gerekmez. Örneğin, sanal bir işlev bildiren ve iki alt sınıfa (B ve C) sahip olan bir A sınıfı göz önünde bulundurulabilir. Ayrıca, B sınıfının D ve E alt sınıflarına ve C sınıfının F ve G alt sınıflarına sahip olduğu düşünülebilir.

B'den G'ye kadar olan sınıfların tümü bir şekilde tanımlanmış A sınıfı sanal fonksiyona sahip olmalıdır. B sınıfı A'nın bir fonksiyonuna sahipse, D ve E sınıflarının yeniden yapılmasına gerek yoktur. Belki de C'nin alt sınıfları A'nın işlevini yerine getirmelidir, ancak her ikisi de farklı bir şey yapar, bu nedenle işlevi C sınıfında tanımlamak faydalı olmaz. Bu durumda, işlev C sınıfında sanal olarak bildirilebilir ve bir uygulama gerekli değildir.

Sanal işlevler öğrenmek zor olabilir, ancak düzgün kullanıldığında kod çoğaltmayı azaltabilir ve genel olarak kodu çok daha kolay hale getirebilir. Sanal işlevli birçok tuzak vardır, ancak özellikle çoklu kalıtımla ilgili. Çoklu kalıtımda, belirsiz bir şekilde tanımlanmış sanal işlevlerin birbiriyle çatışması mümkündür, bu nedenle bu bağlamda dikkatli kullanılmaları gerekir.