調用超類構造函數的規則是什麼?

從子類1調用超類構造函數的C ++規則是什麼? 函數

例如,我知道在Java中,你必須將其做爲子類構造函數的第一行(若是不這樣作,則假定對no-arg超級構造函數進行隱式調用 - 若是缺乏,則會給出編譯錯誤) 。 this


#1樓

若是沒有參數,則會自動爲您調用基類構造函數。 若是要使用參數調用超類構造函數,則必須使用子類的構造函數初始化列表。 與Java不一樣,C ++支持多重繼承(不管好壞),所以必須按名稱引用基類,而不是「super()」。 spa

class SuperClass
{
    public:

        SuperClass(int foo)
        {
            // do something with foo
        }
};

class SubClass : public SuperClass
{
    public:

        SubClass(int foo, int bar)
        : SuperClass(foo)    // Call the superclass constructor in the subclass' initialization list.
        {
            // do something with bar
        }
};

有關構造函數初始化列表的更多信息,請參見此處此處code


#2樓

若是你有一個沒有參數的構造函數,它將在派生類構造函數執行以前被調用。 繼承

若是要使用參數調用基礎構造函數,則必須在派生構造函數中顯式寫入,以下所示: get

class base
{
  public:
  base (int arg)
  {
  }
};

class derived : public base
{
  public:
  derived () : base (number)
  {
  }
};

若是不在C ++中調用父構造函數,則沒法構造派生類。 若是它是非arg C'tor,則會自動發生,若是您直接調用派生構造函數,如上所示,或者您的代碼將沒法編譯,則會發生這種狀況。 string


#3樓

將值傳遞給父構造函數的惟一方法是經過初始化列表。 初始化列表使用:實現,而後是類列表和要傳遞給該類構造函數的值。 it

Class2::Class2(string id) : Class1(id) {
....
}

還要記住,若是你有一個沒有父類參數的構造函數,它將在子構造函數執行以前自動調用。 io


#4樓

在C ++中,在進入構造函數以前,會爲您調用全部超類和成員變量的無參數構造函數。 若是你想傳遞它們的參數,有一個單獨的語法稱爲「構造函數連接」,它看起來像這樣: 編譯

class Sub : public Base
{
  Sub(int x, int y)
  : Base(x), member(y)
  {
  }
  Type member;
};

若是此時運行的任何東西拋出,以前完成構造的基礎/成員都會調用它們的析構函數,而且異常將被從新發送給調用者。 若是要在連接期間捕獲異常,則必須使用函數try塊:

class Sub : public Base
{
  Sub(int x, int y)
  try : Base(x), member(y)
  {
    // function body goes here
  } catch(const ExceptionType &e) {
    throw kaboom();
  }
  Type member;
};

在這種形式中,請注意try塊函數的主體,而不是在函數體內; 這容許它捕獲由隱式或顯式成員和基類初始化以及函數體期間拋出的異常。 可是,若是函數catch塊沒有拋出不一樣的異常,則運行時將從新拋出原始錯誤; 初始化期間的異常不能被忽略。


#5樓

CDerived::CDerived()
: CBase(...), iCount(0)  //this is the initialisation list. You can initialise member variables here too. (e.g. iCount := 0)
    {
    //construct body
    }
相關文章
相關標籤/搜索