2010-02-26 138 views
5

這種情況甚至可能嗎?從基類實例創建派生類實例而不知道類成員

class Base 
{ 
    int someBaseMemer; 
}; 

template<class T> 
class Derived : public T 
{ 
    int someNonBaseMemer; 

    Derived(T* baseInstance); 
}; 

目標:

Base* pBase = new Base(); 
pBase->someBaseMemer = 123; // Some value set 
Derived<Base>* pDerived = new Derived<Base>(pBase); 

pDerived-的值> someBaseMemer應equeal到pBase-> someBaseMember並與其他基體類似。

+3

爲什麼你想要這樣一個扭曲的事情? – GManNickG 2010-02-26 21:27:32

+0

StackOverflowException?大聲笑....在一個嚴肅的說明......這不會編譯。 – 2010-02-26 21:29:43

+0

@Elite:實際上,如果你將會員更改爲公開的話。儘管如此,並沒有讓它變得更恐怖。 – 2010-02-26 21:34:54

回答

3

你爲什麼不真正完成編寫和編譯代碼?

class Base 
{ 
public: // add this 
    int someBaseMemer; 
}; 

template<class T> 
class Derived : public T 
{ 
public: // add this 
    int someNonBaseMemer; 

    Derived(T* baseInstance) 
     : T(*baseInstance) // add this 
    { return; } // add this 
}; 

編譯並按照您的指定運行。

編輯:或者你的意思是someNonBaseMemer應該等於someBaseMemer

+0

派生(T * baseInstance):T(* baseInstance)是解決方案。我嘗試了T(baseInstance)並陷入了編譯器錯誤。編譯器涉及模板的錯誤消息,例如。 SomeClass :: NestedClass :: blablah給我的毛骨悚然。謝謝。 – 2010-02-26 22:07:39

+0

這裏還有一個很好的答案,但已被刪除。我不知道爲什麼。派生(const T&baseInstance):T(baseInstance)也是一個很好的提示,但不適合我的特殊情況。在我的問題中的例子只是一些更大的東西的一小部分。 – 2010-02-26 22:11:13

4

爲什麼要在同一時間派生並傳遞基指針?選擇任何一項,都無法阻止你擁有兩者。使用繼承爲你做這項工作:

class Base 
{ 
    public: 
    Base(int x) : someBaseMemer(x) {} 
    protected:  // at least, otherwise, derived can't access this member 
    int someBaseMemer; 
}; 

template<class T> 
class Derived : public T 
{ 
    int someNonBaseMemer; 

    public: 
    Derived(int x, int y) : someNonBaseMemer(y), T(x) {} 
}; 

Derived<Base> d(42, 32); // usage 

雖然不是最好的選擇作爲設計。

+0

令我驚訝的是,渴望的人如何投票回答錯過了這一點。當Base類有更多成員時,Derived(int,int)構造函數有什麼意義?在您的示例類Derived中:public Base會更好,因爲Derived類必須識別Base類的成員。但它仍然沒有回答我的問題。 – 2010-02-26 22:21:15

+1

不幸的是,您完全錯過了我的觀點,即讓編譯器進行復制。你的例子是一團糟 - 這並不能幫你解決問題。 – dirkgently 2010-02-26 22:24:06

+0

幸運的是有人能夠理解我的混亂並回答我的問題。 – 2010-02-26 22:44:31

1

申報someBaseMemr公共或更改classstruct聲明:

class Base 
{ 
    public: 
    int someBaseMemer; 
}; 

OR 

struct Base 
{ 
    int someBaseMemr; 
}; 

記住,class在默認情況下private訪問所有成員和方法。 A struct默認提供public訪問權限。

此外,所有派生類應具有從Base繼承public

+0

海報的技巧是一種模式,它允許更改基類或派生類的派生路徑。我也使用過這種技術。 – 2010-02-26 21:45:23