2012-11-11 108 views
9

雖然考慮到奇怪問題的「創造性」(即離奇)解決方案,但一個特定的想法引發了我的好奇心。這可能不是我想要使用的想法,但我仍然想知道根據標準它是否合法。成員類是否可以從它的父類繼承?

一個簡單的例子是...

class base_t 
{ 
    private: 
    // stuff 

    public: 
    // more stuff 

    class derived_t : public base_t // <--- weirdness here 
    { 
     // ... 
    };  
}; 

部分古怪的 - 因爲從base_t包含derived_tderived_t繼承,好像derived_t包含本身。

所以 - 這是一個類似於curiously recurring template pattern類似的有效但奇怪而可怕的東西,還是非法?

編輯 - 我也許應該提一下,我想到這個的原因是爲了避免一些命名空間的污染。有一個班級作爲會員可以避免引入另一個全球班級,但第二班級需要分享很多。

如果它只是一對類,它不會是一個問題,但這是一個代碼生成器。

+1

想一想。想想一個包含它自己的盒子...... –

+2

從OOP的角度來看,這至少是沒用的...... –

+0

@Bruno:不一定。 –

回答

9

這是合法的,但可能不是您安排代碼的方式。基類在使用時必須完成,但是直到定義的右括號爲止。因此,請嘗試前向聲明嵌套類:

class base_t 
{ 
    private: 
    // stuff 

    public: 
    // more stuff 

    class derived_t; 
}; 

class base_t::derived_t : public base_t 
{ 
    // ... 
};  
+0

現在我開始想知道派生類CRTP的完整性。這裏有些微妙的東西。 –

+0

@Alf:那麼,類*由於兩階段處理而在成員函數中是完整的。也許這也適用於嵌套類型定義。但是,對於CRTP,模板參數不一定是完整的,而基於不完整類的模板不一定是不完整的。 –

相關問題