2013-01-25 121 views
0

下一個問題可能看起來像一個重複的,但在現場我無法找到確切的想法在其他地方。C++基類和派生類的限制

簡單介紹:這個問題提出,因爲我試圖瞭解我的課多了幾分複雜的繼承組合。

一個音符之前我提出的問題 - 我不看做一種「解決方案」的,只希望與大家共同探討的話題,並獲得更好的思考。

假設你有下面幾行:

class C : public B 
{ 
    public : 
     C (const B& b) : B (b) {} 
     B& operator*() {return *this;} 
}; 

int main() { 
    A* pA = new B(); 
    C& c = pA -> doIt(); 
    *c = *pA; 
    c = *pA; 
    return 1; 
} 

此代碼是不完整,這是整個目的 - 假設它確實complie並在此代碼提取的約束。 不過我不會只寫代碼,並請您解釋一下頂掉你頭上的任何約束,而是我會增加我的concreate問題:

什麼約束我們是否有以下行:

C& c = pA -> doIt(); 

據我所知,上面的代碼有一個凝視的約束,這是這些類的層次結構順序:C是B的衍生物,B是女性的A(糾正我如果我錯了......)

我試圖同時保持我上述的層次結構,以實際定義這些類,我不能有doIt方法()返回一個它的派生類C的類型,我可以使用不完整的C型&在函數的原型,但我卻不能返回類型C的對象

謝謝你在前進, SyndicatorBBB

+0

既然這樣,'A'必須B'的'(可能間接)鹼; 'A'必須定義一個成員函數'C&doIt()','C'必須定義一個賦值操作符來接受'A'。 –

+0

如何實現A的mmember函數C&doIt()?你必須在這個函數的主體中創建一個完整類型的dervied類,這是不可能的。 – SyndicatorBBB

+0

你是指c的成員函數返回類A的對象? – Arpit

回答

2

試試這個:

class C; 

struct A 
{ 
    C & doIt(); 
}; 

struct B : A 
{ 
    void operator=(A const &) { } 
}; 

class C : public B 
{ 
public : 
    using B::operator=; 
    C (const B & b) : B(b) {} 
    B & operator*() { return *this; } 
}; 

C & A::doIt() 
{ 
    static B bimpl; 
    static C cimpl(bimpl); 
    return cimpl; 
} 

注意隱含的賦值運算符隱藏了基礎版本,所以我們需要用using申報經營者明確取消隱藏。