2010-12-04 88 views
10

我已經減少了我的問題到下面的示例代碼:爲繼承的類的默認構造方法

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n); 
}; 

MewTwo::MewTwo(int n) {} 

將會產生一個錯誤:

no matching function for call to ‘pokemon::pokemon()’

認爲的情況是,當我嘗試編寫不存在的MewTwo構造函數時,會調用pokemon的默認構造函數。我對C++比較陌生,所以我只是在這裏猜測。有任何想法嗎?

限制:修復程序無法修改或添加公共成員到類。

回答

13

其實你正在尋找的是成員初始化列表。將您的繼承類構造函數更改爲以下內容:

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) : pokemon(n) {} 
}; 

您在識別正在發生的事情時是正確的。基本上,當你創建繼承類時,你首先創建基類,並且你不能這樣做,因爲沒有定義默認的構造函數。成員初始化列表可幫助您解決該問題:)

查看更多示例:http://www.cprogramming.com/tutorial/initialization-lists-c++.html

+1

我從來沒有聽說過成員初始化列表,感謝它現在完美意義上的鏈接! :) – Coltin 2010-12-04 06:27:46

5

試試這個:

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) :pokemon(n){} 
}; 
+4

+1。基類和成員在派生類的構造函數代碼運行之前被初始化。如果您不希望將默認構造函數用於此目的,則必須指定要使用的構造函數以及要傳遞的參數。如圖所示,這是通過初始化列表完成的。在基類中,您定義了一個構造函數,該構造函數禁止創建默認構造函數。 – 2010-12-04 05:56:26