2012-07-25 75 views
1

我有一個基類,並且從它派生的類很少。我沒有在基類中寫任何拷貝構造函數,它使用默認的構造函數。派生類中的拷貝構造函數

所以,如果我寫這樣的代碼:

base* b; 
b = new base(*this) 

它工作正常,但如果我寫的東西是這樣的:

base* b; 
b = new derive(*this) 

它讓我對沒有匹配功能的錯誤在派生類中。

無法將基類'this指針指向其派生類複製構造函數以初始化它?

回答

3

Derived複製構造函數需要const Derived &作爲它的參數。您不能使用const Base &作爲參數。

你正在嘗試做的:

Derived *d = new Derived(); 
Base *b = new Base(*d); //ok, since Derived is subclass of Base 

Base *b = new Based(); 
Derived *d = new Derived(*b); //error, since Base in not subclass of Derived 

爲了構建DerivedBase您需要提供這樣的構造自己:

Derived(const Base &base) {...} 
+0

感謝您的回答安德魯,所以要構建Derived(const Base&base){...},我必須首先編寫一個基類複製構造函數?其實我嘗試添加派生類覆蓋版本,正如你所建議的,但現在它抱怨在基類中沒有匹配函數:( – Ruchi 2012-07-25 10:18:43

+0

@Ruchi:如果默認的不夠用 - 是的,但不要忘記調用基礎拷貝構造函數派生初始值設定項列表 – Andrew 2012-07-25 10:20:15

+0

好的,我寫了類似於派生派生::派生(const base&b),但它給了我錯誤:錯誤:沒有匹配的函數調用base :: base(),候選人是base :: base (const base&)和base :: base(some_arg),我不知道什麼是錯誤的,我的意思是爲什麼erive :: derive(const base&b)試圖調用base :: base()?? – Ruchi 2012-07-25 10:34:48

0

過載配版的衍生構造器,是以基地類作爲參數。這應該工作。

0

不,你不能。可能還有base的其他子類。如果類derive的複製構造函數接受const base&,則可以將其傳遞給base的另一個子類的實例。類derive的拷貝構造函數不知道如何處理這樣的對象。