2012-08-30 95 views
1

我很好奇如果在下面的程序中Base* base在類Container中可以用Base& base代替嗎?
Base base它不能被替換,因爲Base是抽象的。
隨着Base& base對象應該分配到某個地方,所以我仍然不能擺脫指向分配對象的指針。引用代替抽象類的指針

#include <iostream> 
class Base 
{ public: 
    virtual void str()=0; 
}; 

class A : public Base 
{ int i; 
    public: 
    A(int i):i(i){} 
    void str(){std::cout<<i<<std::endl;} 
}; 

class B : public Base 
{ double f; 
    public: 
    B(double f):f(f){} 
    void str(){std::cout<<f<<std::endl;} 
}; 

class Container 
{ Base *base; 
    public: 
    Container(int i) { base=new A(i);} 
    Container(double f) { base=new B(f);} 
    void str(){ base->str();} 
}; 
int main() 
{ 
    Container c1(8),c2(13.0); 
    c1.str(); 
    c2.str(); 
    return 0; 
} 
+0

我認爲這篇文章應該給你一個答案: http://stackoverflow.com/questions/7192069/polymorphic-c-references – Tazadar

回答

4

與您的代碼,我我就不會推薦它,因爲Containerbase所有者和參考,語義,意味着其他的東西(別名)。

從技術上來說,沒有什麼能阻止你:

class Container 
{ Base &base; 
    public: 
    Container(int i) : base(*new A(i)) {} 
    Container(double f) : base(*new B(f)) {} 
    void str(){ base->str();} 
}; 

注意引用在初始化列表中被初始化。

你還是會需要清理內存,並且它看起來醜陋與參考:

~Container() { delete &base; } 

,而不是

~Container() { delete base; } 

,如果你使用的指針。當然,使用std::unique_ptr而不是這兩個中的任何一個都會使生活變得更容易

此外,請務必執行(或聲明爲privatedeleted)複製構造函數或賦值運算符。

後來現貨 - 你需要提供Basevirtual析構函數,否則你會碰到未定義行爲的領土時,你會試圖清理內存。