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的私有方法,而其他外部类则不能。这是处理定义为接口的特定回调的绝佳模式。
- 3 回答
- 0 关注
- 1395 浏览
添加回答
举报