为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
白衣染霜花 2019-10-05 13:33:42
与受保护的继承不同,C ++私有继承已进入主流C ++开发。但是,我仍然没有找到很好的用处。你们什么时候使用它?
查看完整描述

3 回答

?
慕桂英546537

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转换。系统的其余部分不需要了解它,因此指示了私有继承。


查看完整回答
反对 回复 2019-10-05
?
富国沪深

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的私有方法,而其他外部类则不能。这是处理定义为接口的特定回调的绝佳模式。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 1395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信