Sanal temel sınıflar
Bir sınıf türetilmiş bir sınıf için dolaylı bir temel sýnýf birden çok kez olabileceğinden, C++ gibi temel biçimini en iyi duruma getirmek için bir yol çalışma sınıfları sağlar. Sanal temel sınıflar kazanmak ve birden çok devralma kullanan sınıf hiyerarşisi içinde ambiguities önlemek için bir yol sunar.
Sanal olmayan her nesnenin bir kopyasını base sınıfında tanımlanmış veri üyeleri içerir. Bu çoğaltma harcar ve bunlara erişim her istediğiniz temel sınıf üyesi kopyasını belirtmenizi gerektirir.
Temel bir sýnýf sanal temel olarak belirtildiğinde, dolaylı bir temel olarak birden fazla veri üyeleri çoğaltma davranabilir. Veri üyeleri tek bir kopyasını sanal bir temel olarak kullanmak temel sınıflar tarafından paylaşılır.
Sanal bir temel sınıf bildirirken sanal anahtar sözcüğünü türetilmiþ sýnýflarýn temel listelerinde görünür.
Benzetimli öğle yemeği satırı gösterir şekilde sınıf hiyerarşisi düşünün.
Benzetimli öğle yemeği çizgi grafik
Şekilde, Queue her ikisi için de temel sınıfı olan CashierQueue ve LunchQueue. Ancak, her iki sınıfın da birleştirilir forma LunchCashierQueue, aşağıdaki sorun ortaya çıkar: yeni bir sınıf türü iki ındaki içerir Queue, bir karşı CashierQueue ve diğer LunchQueue. (Gerçek bellek yerleşimi optimize) kavramsal bellek düzeni aşağıdaki şekilde gösterilmiştir.
Benzetimli öğle yemeği satır içi nesne
İki olduğunu Not Queue , subobjects LunchCashierQueue nesne. Aşağıdaki kod bildirir Queue sanal bir temel sınıf olmak için:
// deriv_VirtualBaseClasses.cpp
// compile with: /LD
class Queue {};
class CashierQueue : virtual public Queue {};
class LunchQueue : virtual public Queue {};
class LunchCashierQueue : public LunchQueue, public CashierQueue {};
virtual Anahtar sözcüğü, subobject yalnızca bir kopyasını sağlar Queue bulunur (bkz. aşağıdaki şekilde).
Benzetimli öğle yemeği satır nesnesi ile sanal temel sınıflar
Bir sınıf, hem sanal hem de belirli bir türde sanal olmayan bir bileşen olabilir. Bu aşağıdaki çizimde gösterildiği koşullarında ortaya çıkar.
Aynı sınıfın sanal ve sanal olmayan bileşenler
Şekilde, CashierQueue ve LunchQueue kullanmak Queue sanal bir temel sınıf olarak. Ancak, TakeoutQueue belirtir Queue değil sanal bir temel sınıf bir temel sınıf olarak. Bu nedenle, LunchTakeoutCashierQueue iki ındaki türü olan Queue: içeren devralma yolu birinden LunchCashierQueue ve içeren yolu birinden TakeoutQueue. Bu aşağıdaki çizimde gösterilmiştir.
Sanal ve sanal olmayan mirası ile nesne düzenini
Not
Sanal devralma sanal olmayan Kalýtým ile karşılaştırıldığında önemli boyutu yararları sağlar.Ancak, ek işlem yükü çıkarabilir.
Türetilmiþ bir sýnýf sanal Temel sınıftan kalıtımla alan sanal bir işlevi geçersiz kılar ve bir kurucu ya da yıkıcı bir işaretçi sanal temel sınıf ile türetilmiş bir temel sınıf aramalar için derleyici sanal esaslarını sınıflarıyla içine ek gizli "vtordisp" alanları doğurabilir. /Vd0 derleyici seçeneği gizli vtordisp yapıcı/yıkıcı öteleme üye eklenmesini engeller. Bunları gerekli oldukları /vd1 derleyici seçeneği varsayılan olarak etkinleştirir. Yalnızca tüm sınıf Kurucularını ve yıkıcı sanal neredeyse arama işlevleri, eminseniz vtordisps devre dışı bırakın.
/Vd derleyici seçeneği tüm derleme modül etkiler. Use vtordisp pragma bastırmak ve vtordisp alanları sınıf sınıf için ayrı ayrı yeniden etkinleştirmek için:
#pragma vtordisp( off )
class GetReal : virtual public { ... };
#pragma vtordisp( on )