什么时候应该使用C ++私有继承?

与受保护的继承不同,C ++私有继承已进入主流C ++开发。但是,我仍然没有找到很好的用处。

你们什么时候使用它?


白衣染霜花
浏览 1396回答 3
3回答

慕桂英546537

我用它所有的时间。举几个例子:当我想公开一些而不是全部基类的接口时。公共继承将是一个谎言,因为Liskov的可替代性被破坏了,而组合则意味着编写了一堆转发函数。当我想从没有虚拟析构函数的具体类派生时。公共继承将邀请客户端通过指向基础的指针进行删除,从而调用未定义的行为。一个典型的示例是从STL容器私下派生的:class MyVector : private vector<int>{public:&nbsp; &nbsp; // Using declarations expose the few functions my clients need&nbsp;&nbsp; &nbsp; // without a load of forwarding functions.&nbsp;&nbsp; &nbsp; using vector<int>::push_back;&nbsp; &nbsp; // etc...&nbsp;&nbsp;};在实现适配器模式时,从Adapted类私有继承可以节省转发到封闭实例的麻烦。实现私有接口。这通常伴随观察者模式出现。MyClass说,通常我的Observer类会订阅一些Subject。然后,只有MyClass需要执行MyClass-> Observer转换。系统的其余部分不需要了解它,因此指示了私有继承。

富国沪深

私有继承的一种有用用法是当您有一个实现接口的类,然后该类向其他对象注册。您可以将该接口设为私有,以便类本身必须注册,并且只有其注册时使用的特定对象才能使用这些功能。例如:class FooInterface{public:&nbsp; &nbsp; virtual void DoSomething() = 0;};class FooUser{public:&nbsp; &nbsp; bool RegisterFooInterface(FooInterface* aInterface);};class FooImplementer : private FooInterface{public:&nbsp; &nbsp; explicit FooImplementer(FooUser& aUser)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; aUser.RegisterFooInterface(this);&nbsp; &nbsp; }private:&nbsp; &nbsp; virtual void DoSomething() { ... }};因此,FooUser类可以通过FooInterface接口调用FooImplementer的私有方法,而其他外部类则不能。这是处理定义为接口的特定回调的绝佳模式。
打开App,查看更多内容
随时随地看视频慕课网APP