C++'da sınıf hiyerarşileri, bir temel sınıftan iki alt sınıfın miras alması ve ardından bu iki sınıftan miras alan başka bir sınıfın oluşturulması durumunda oluşan elmas sorununu (diamond problem) tetikleyebilir. Bu durumda, miras alan sınıfın nesnesi, temel sınıfın iki bağımsız kopyasını içerir. Bu sorunu çözmek için C++'da sanal kalıtım uygulanmıştır.
Normal çoklu kalıtım kullanıldığında:
class A { public: int x; }; class B : public A {}; class C : public A {}; class D : public B, public C {};
D nesnesi, A'nın iki kopyasını içerir: bir B üzerinden, diğeri C üzerinden. Bu, A::x'e erişimde belirsizliklere ve gereksiz bellek harcamasına neden olur.
Sanal kalıtım, temel sınıfın kopyalanmasını ortadan kaldırır. Tek bir A temel sınıfı örneği, tüm alt sınıflar tarafından kullanılır:
class A { public: int x; }; class B : public virtual A {}; class C : public virtual A {}; class D : public B, public C {};
Artık D sadece bir A kopyası içerir ve A::x'e erişimdeki belirsizlik ortadan kalkar.
Ana özellikler:
Elmas sorununu scope resolution kullanarak çözmek neden mümkün değildir?
Scope resolution, yalnızca temel sınıf üyelerine erişimdeki belirsizlikleri çözer, ancak temel sınıfın fazladan kopyalarını kaldırmaz. Çift başlatma ve çift veri saklama sorunu devam eder.
Sanal kalıtımda yapıcılar hangi sırayla çağrılır?
Sanal temel sınıf yapıcıları öncelikle ve yalnızca bir kez çağrılır ve bu, miras hiyerarşisindeki en son sınıfın yapıcısı tarafından gerçekleştirilir.
Örnek:
class A { public: A() { std::cout << "A\n"; } }; class B : public virtual A { public: B() { std::cout << "B\n"; } }; class C : public virtual A { public: C() { std::cout << "C\n"; } }; class D : public B, public C { public: D() { std::cout << "D\n"; } }; D d; // Çıktı: A B C D
Sanal kalıtımın hem duyurulmasında hem de tanımında belirtilmesi zorunlu mudur?
Evet, sanal kalıtım, ilgili temel sınıfın miras alındığı her yerde belirtilmelidir. Aksi takdirde derleme hatası kaçınılmazdır ve çoklu kalıtım normal hale gelir.
Sanal kalıtım uygulanmamış karmaşık bir hiyerarşi, nesnede iki kopya ayar bulunmasına neden olur:
Artılar:
Eksiler:
En üst alt sınıfın tutarlı yapıcısı ile sanal kalıtım kullanıldı:
Artılar:
Eksiler: