2012-03-16 73 views
7

我是C++的新生,尤其是面向對象的編程。現在我在學習期間遇到問題。虛擬繼承中的構造函數順序

有以下內容的類層次結構:

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{}; 

,現在我想知道構造爲final類對象的定義的順序是什麼。

我畫一個圖: enter image description here structure of class inheritance http://hi.csdn.net/attachment/201203/16/2712336_1331902452BziD.jpg

我知道虛基類構造總是非虛基地之前類無論在哪裏,他們出現在繼承層次的。我感到困惑的是,如果Class類的構造函數在Base之前,並且Class的構造函數被調用了兩次。爲什麼?

有人可以告訴我的答案嗎?越詳細越好。

+7

這很容易找出一個懶惰的方式。構建一個程序。把調試cout語句放在你的每個構造函數中(.e.g「我是基礎構造函數!」)。遵循結算語句,觀察施工順序。 – 2012-03-16 13:01:18

+3

警告:直接基'Class'在'Final'人跡罕至由於歧義 – 2012-03-16 13:08:27

+0

@ 0A0D:當然,只告訴你手頭的編譯器會發生如何實現它。這對你來說可能夠好,但也許不是。 :) – 2012-03-16 13:08:58

回答

8

通過FinalBaseClass直接繼承不是virtual,所以Final一個實例具有Class類型的基類的子對象。作爲Base的直接基地的構築在Base之前構築,作爲Final的直接基地的構築之後(實際上在MI之後)構築。

的原因是:

  1. 基地直接在他們列出的順序構建的(除非他們已經已經構建的虛擬基礎),
  2. 基地之前類的構造自己的構造函數運行。

應用(1)Final告訴我們,ClassMI以後建造的。多次應用(2)告訴我們在Base之前,Derived1Derived2之前,在MI之前構建了Class