2009-09-21 82 views
1

我有類似的東西:C++ - 克隆基類

Class Foo : Base {.."my stuph" ..}; 

int main() { 
    Base *b = new Base; 
    Foo f (b); <== **error** "invalid conversion from Base to Foo." 
    .. 
} 

我如何可以克隆B至F?
在「我的陰影」中,我有在Foo和Base之間進行鍛鍊的功能。
我不能改變基地,雖然它是由他人寫的。

感謝

+0

你爲什麼不這樣做:Foo * f = new Foo;? – 2009-09-21 12:51:25

+2

基數b =新基數;看起來很奇怪我 – MadH 2009-09-21 12:51:59

+0

修訂:看* Java *給我。 – 2009-09-21 12:55:12

回答

5

你不能自動派生一個派生類。但是,反過來也可以創建基類,但這可能會讓您感到困惑。

做你想做什麼,你應該添加適當的構造函數Foo,並認爲你將如何實際創建信息在Base實例失蹤構成一個全功能的Foo實例。

構造可以是這樣的:

Foo(Base const& b) : Base(b) 
{ /* construct info specific to Foo (absent in Bar) */ } 
+0

謝謝,這是非常明確的解釋。 – name 2009-09-21 14:02:23

4

定義一個構造函數類型庫的參數:

Foo(const Base & b) 
: Base(b) // construct the base class, using its copy constructor 
{ 
    // plus, initialize Foo-specific member data here 
} 

BTW:你確定你想要基地是私人的基類?

+4

那麼,如果你要選擇尼特,「你確定'class'關鍵字是大寫?」。 「你確定你想讓b被堆分配嗎?」。 「你確定你可以把'new B'的結果賦給一個'B'類型的變量?」。我認爲所有這些東西的答案是「不」;-) – 2009-09-21 12:54:40

+0

嗯,我錯過了類關鍵字是大寫。無論如何,編譯器會抱怨它,所以我確信它是一個錯字。但是,通過省略訪問說明符來使基類保持私有狀態是完全合法的,但是如果不是有意的話,這會非常混亂,所以我想指出它。 – 2009-09-21 12:59:20

+1

@tkopec:問題是代碼包含比其他任何更多的錯別字。雖然你的建議很好,但我有些懷疑這是馬裏烏斯想要的。畢竟這不是克隆操作。但是呢 - 他似乎對克隆概念很模糊。 – sbi 2009-09-21 13:23:29

1

提供一個構造函數,它接受一個基類或對其的引用。

1

給富構造,這需要基本參數:

class Foo : public Base { 
public: 
    explicit Foo(const Base &b) { 
     // do work to initialise Foo. You might want to include 
     Base::operator=(b); 
     // or you might not. Depends how Foo works, and what Base's 
     // constructors do. 
    } 
}; 

當你寫一個參數的構造函數,就應該考慮是否要指定「明確的」。

「顯式」是否可以說構造函數只應用於您已經明確寫出構造函數調用或強制轉換的地方。如果它不存在,那麼編譯器也會「暗示」在下列情況下轉換基本對象來富,例如:

int doSomething(const Foo &f) { 
    return 23; 
} 

Base b; 
doSomething(b); // doesn't compile 
doSomething(static_cast<Foo>(b)); // does compile 

如果去掉了「明確的」,然後doSomething(b)將彙編,並做同樣的作爲第二行 - 從b構造一個臨時Foo對象,並將其傳遞給doSomething。

1

克隆操作是,它提供的對象的精確副本。將Base轉換爲Foo將不是克隆操作。

在你的問題,class是用大寫「C」,Foo從基地私下派生,它的成員(對這個問題很重要)不會顯示,Base b = new Base不會編譯,我不知道「 「FooBase之間的鍛鍊」應該是指。請花時間創建一個正確的示例,以顯示(僅)您遇到的問題,並提供您所看到的和您所期望的內容的準確描述。由於這個問題,我不確定從哪裏開始告訴你你做錯了什麼。我建議你改變你的問題來顯示一些編譯的代碼(除了你有問題)。

然後我可能可以編輯這個答案,以便它解釋發生了什麼。