我有以下典型的場景,其中我想隱藏在子類實現的細節,並通過接口將其暴露:訪問保護功能
template <typename Derived>
class Interface
{
public:
void a()
{
static_cast<Derived*>(this)->_a();
}
};
class Implementation : public Interface<Implementation>
{
protected:
void _a()
{
/*
...
*/
}
};
我想我明白爲什麼這並未並且我知道聲明類Interface
是Implementation
的朋友可以解決它,但是當涉及到更復雜的層次結構(如多個接口)和各種級別的繼承(就像我的真實情況)時,事情變得非常混亂。
我想避免在每個實現接口的類中聲明friend class Interface<Implementation>
。
對於這個問題,有沒有另一個好的解決方案?
謝謝!
使'_a()'不受保護?那或「朋友」是真正走的唯一途徑。 – Barry
當然,這是一個解決方案,但是然後每個人都可以訪問_a(),這是我不想做的。如果沒有CRTP,這種情況非常簡單,所以我認爲它也可以用它來完成。 –
不要將實現類型的對象暴露在模塊的界面中,那麼每個人都無法訪問它們。 –