3 回答

TA貢獻1848條經驗 獲得超10個贊
我用它所有的時間。舉幾個例子:
當我想公開一些而不是全部基類的接口時。公共繼承將是一個謊言,因為Liskov的可替代性被破壞了,而組合則意味著編寫了一堆轉發函數。
當我想從沒有虛擬析構函數的具體類派生時。公共繼承將邀請客戶端通過指向基礎的指針進行刪除,從而調用未定義的行為。
一個典型的示例是從STL容器私下派生的:
class MyVector : private vector<int>
{
public:
// Using declarations expose the few functions my clients need
// without a load of forwarding functions.
using vector<int>::push_back;
// etc...
};
在實現適配器模式時,從Adapted類私有繼承可以節省轉發到封閉實例的麻煩。
實現私有接口。這通常伴隨觀察者模式出現。MyClass說,通常我的Observer類會訂閱一些Subject。然后,只有MyClass需要執行MyClass-> Observer轉換。系統的其余部分不需要了解它,因此指示了私有繼承。

TA貢獻1790條經驗 獲得超9個贊
私有繼承的一種有用用法是當您有一個實現接口的類,然后該類向其他對象注冊。您可以將該接口設為私有,以便類本身必須注冊,并且只有其注冊時使用的特定對象才能使用這些功能。
例如:
class FooInterface
{
public:
virtual void DoSomething() = 0;
};
class FooUser
{
public:
bool RegisterFooInterface(FooInterface* aInterface);
};
class FooImplementer : private FooInterface
{
public:
explicit FooImplementer(FooUser& aUser)
{
aUser.RegisterFooInterface(this);
}
private:
virtual void DoSomething() { ... }
};
因此,FooUser類可以通過FooInterface接口調用FooImplementer的私有方法,而其他外部類則不能。這是處理定義為接口的特定回調的絕佳模式。
添加回答
舉報