Sanal kalıtım yalnızca sınıflar Foo
'dan miras kalacaksa geçerlidir.Ben şunları tanımlarsanız:
class B {};
class L : virtual public B {};
class R : virtual public B {};
class D : public L, public R {};
Ardından nihai nesne yalnızca her iki
L
ve
R
tarafından paylaşılan
B
bir kopyasını içerecektir.
virtual
olmadan,
D
türünde bir nesne, ,
R
'dan biri olan
B
'un iki kopyası içerir.
tüm miras sanal gereken bazı argüman yoktur (bir fark yaratıyor durumlarda çünkü o size zaman içinde en çok istediği şeydir). Bununla birlikte, pratikte sanal kalıtım pahalıdır ve çoğu durumda gerekli değildir: iyi tasarlanmış bir sistemde, çoğu kalıtımı, bir veya bir daha "arayüz" den gelen bir somut sınıftan olacaktır; Böyle bir beton sınıfı genellikle kendisinden türetilen olarak tasarlanmamıştır, bu yüzden sorun yoktur. Ancak önemli istisnalar vardır: Örneğin, bir arabirimi tanımlarsanız ve arabirime uzantıları tanımlarsanız, uzantılar temel arabirimden miras almalıdır, çünkü somut bir uygulama çeşitli uzantıları uygulamak isteyebilir. Veya, belirli sınıfların yalnızca arabirimin bir kısmını uyguladığı karışımlar tasarlıyorsanız ve son sınıfı, bu sınıfların birkaçından ( arabiriminin bir parçası) birinden devralınır. miras kamu değilse
, muhtemelen sanal olmamalı (hiç görmedim: Sonunda, olmadığı konusunda criteron neredeyse ya da değil çok zor değildir miras bir istisna), sınıf bir temel sınıf olarak tasarlanmış değilse aksi
, aksi
miras sanal olmalı, sanal miras gerek yoktur.
Orada birkaç istisna vardır, ancak yukarıdaki kuralları güvenliği elden bırakmıyoruz; 'un sanal mirasın gerekli olmadığı durumlarda bile sanal olarak bile miras almak genellikle “doğru” dur.
Bir son nokta: sanal bir temel zaman değildir direkt olarak miras (ve miras sanal olduğunu beyan eder) sınıfı, en türetilmiş sınıf tarafından başlatılmalıdır. Pratikte ise, bu bir sorun değil. Sanal devralmanın mantıklı olduğu durumlara bakarsanız, her zaman bir arabirimden miras alma, veri içermeyen ve dolayısıyla (yalnızca) bir varsayılan kurucuya sahip olan bir duruma bakar. Kendinizi buluyorsanız, argümanlarını alan yapıcılarla sınıflardan sanal olarak miras alıyorsanız, tasarım hakkında bazı ciddi sorular sorma zamanı gelmiştir.
Cevap vermeyeceğim çünkü konu bu tür sığ tedaviyi gerçekten hak etmiyor: "sanal" olmadan "Bar" öğesinden devralan her sınıf, "Sanal" ile kendi "Bar" kopyasına sahip olacak En çok türetilen sınıfın "Bar" ın yalnızca bir kopyası olacaktır. –
Deneyin: [bu arama] (http://stackoverflow.com/search?q = sanal + devralma +% 5Bc% 2B% 2B% 5D) –
[In C++ sanal temel sınıfının olası kopyası?] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class) –