2010-12-18 51 views
1

鑑於這種代碼:爲什麼Base * pd = new Derived;產生一個錯誤?

class Base{ 
public: 
    Base(); 
    virtual ~Base(); 
}; 

class Derived: protected Base{ 
public: 
    virtual ~Derived(); 
}; 

在主我試圖賦予衍生的基地這樣:

Base *pd = new Derived; 

爲什麼這個說法產生錯誤?

這裏new將返回一個對象類型的指針,我們總是可以將一個派生指針賦值給一個基類。糾正我,如果我錯了。

+2

No code ?!可能有任何數量的錯誤... – 2010-12-18 23:35:00

+1

可能是因爲你沒有聲明'Derived:Base' – BoltClock 2010-12-18 23:36:43

+1

這應該工作,是的。最明顯的解決方案是@BoltClock提供的解決方案。派生必須首先繼承Base。如果情況並非如此,請提供一些能夠幫助某人診斷問題的代碼。另外,錯誤信息是什麼? – mingos 2010-12-18 23:51:39

回答

9

要將指向一個類的指針轉換爲指向不同類類型的指針,轉換必須在被調用的位置可訪問。

作爲BaseDerived一個保護基不能從表達式new Derived(其具有類型Derived *)的Derived成員函數的外部初始化Base *類型的變量,類從它派生或Derived一個friend

+0

,但即使通過使它成爲一個公共繼承,我得到一個鏈接錯誤..在派生類中繼續未提及聯繫和析構函數... LNK2019 – sriks 2010-12-19 03:28:27

+1

class Base { public: Base(); virtual〜Base(); }; class Derived:protected Base { public: virtual〜Derived(); }; int main() { Base * pd = new Derived; return 0; } – sriks 2010-12-19 03:48:20

+1

@Srikanth Reddy:那是因爲你沒有實現構造函數和析構函數。 – greyfade 2010-12-19 05:41:47

0

鏈接器錯誤可能只是缺少類實現的結果。如果您可以發佈特定的錯誤消息,這將有所幫助。

相關問題