2010-09-02 126 views
5

我想做的事情做在一個基類中的公共成員在派生類中私有的,就像這樣:我可以在派生類中創建一個公共成員變量private嗎?

class A { 
public: 
    int x; 
    int y; 
}; 

class B : public A { 
    // x is still public 
private: 
    // y is now private 
    using y; 
}; 

但顯然「使用」,不能使用這種方式。有沒有辦法在C++中做到這一點?

(因爲有其他成員和一名仍然必須是公共的功能,我不能使用私有繼承。)

+1

這感覺就像一個笨拙的設計。即使你可以爲B類做這件事,所有人需要做的事情都是上傳到A的指針或引用,然後他們將能夠訪問該成員。 – TheUndeadFish 2010-09-02 02:38:46

+1

的可能的複製[C++:如何將公開從基類繼承,但做了一些從基類派生類中的私有公有方法?(http://stackoverflow.com/questions/2986891/c-how-to -publicly - 繼承 - 從-A-基類,但是,化妝一些-的公共的方法-FR) – 2010-09-02 04:26:15

回答

3

簡短的回答:沒有。 Liskov替換和公有繼承的性質要求,你可以用A(即公共成員)所做的一切也可以通過B來完成。這意味着你不能隱藏公開的方法。

如果你想隱藏公共fields,沒有什麼可以做。 「隱藏」的公共方法,你可以這樣做:

class B { 
    // x is still public 
    int x() { return a.x(); } 
private: 
    A a; 
    // y is now private since you didn't add a forwarding method for it 
}; 
3

是,使用聲明technically允許你這樣做。

你必須使用using A::y代替using y

但是請認真評估,如果這樣做有設計感。

幾點意見:

  1. 您的類不應該有公開的數據。儘可能避免這種情況。如果你堅持這個設計原則,你可能沒有必要在派生類中將它設爲私有。

  2. 玉碎LSP。如果基類具有公共方法,並且除非您正在進行私有繼承,則如果派生類使基類方法與使用聲明的私有方法保持私有關係,則客戶端將會感到困惑。

相關問題