2012-03-16 26 views
7

Özellikle nesne yönelimli programlama hakkında C++ 'da bir birinci sınıftayım. Ve şimdi benim öğrenme sırasında bir sorunum var.Sanal kalıtımda kurucu emri

Orada izleyen bir sınıf hiyerarşisi:

class Class{}; 

class Base:public Class{}; 

class Derived1:virtual public Base{}; 

class Derived2:virtual public Base{}; 

class MI:public Derived1,public Derived2{}; 

class Final:public MI,public Class{}; 

Ve şimdi bir final sınıf nesnesinin tanımı için yapıcı sırası ne olduğunu bilmek istiyorum. enter image description here structure of class inheritance http://hi.csdn.net/attachment/201203/16/2712336_1331902452BziD.jpg

Ben Sanal taban sınıfları hep bakılmaksızın miras hiyerarşisinde nerede görüntüleneceğini önceden nonvirtual tabanına sınıfları inşa edilir biliyorum:

Ben bir diyagram çizin. Kafam karıştıran şey, eğer Sınıf Sınıfı kurucusu Tabandan önce ise ve Sınıfın yapıcısı iki kez çağrılırsa. Ve neden?

Birisi cevabımı söyleyebilir mi? Daha detaylı, daha iyi.

+7

Tembel bir şekilde anlaşılması oldukça kolaydır. Bir program oluşturun. Yapıcılarınızın her birine hata ayıklama cout ifadeleri koyun (.e.g "Ben Temel Yapıcıyım!"). Cout ifadelerini takip ederek inşaat sırasına uyun. –

+3

uyarı: Belirsizliğe bağlı olarak 'Final' 'temeline' Class' erişilemediğinden –

+0

@ 0A0D: Tabii ki bu sadece derleyicinin el altında olmasını nasıl sağladığını anlatıyor. Bu senin için yeterince iyi olabilir, ama belki de değil. :) –

cevap

8

Final ve Base ile Class doğrudan kalıtım virtual değildir, bu nedenle Final bir örneğin tip Class arasında iki temel sınıf subobjects sahiptir. Base'un doğrudan tabanı olan, Base'dan önce inşa edilmiştir ve daha sonra Final'un doğrudan tabanı olan bir yapı (aslında MI'dan sonra) yapılmıştır. (Onlar zaten inşa edilmiştir sanal tabanı olmadıkça)

  1. doğrudan bazlar
  2. bazlar sınıfı en önce inşa edilir, listelendikleri sırayla inşa edilir:

    nedeni olduğunu kendi kurucu çalışır.

Final için (1) uygulanması ClassMI sonra inşa edilmiştir söyler. (2) birkaç kez uygulandığında, Class'un Base'dan önce, Derived1 ve Derived2'dan önce MI'dan önce oluşturulduğunu bildirir.