gpt4 book ai didi

c++ - protected 继承是可传递的吗?

转载 作者:行者123 更新时间:2023-11-30 02:10:55 25 4
gpt4 key购买 nike

假设我有一个监听器接口(interface)定义为:

class Listener
{
public:
virtual void doSomething(void) = 0;
}

和一个从我的接口(interface)公开继承的抽象类:

class AbstractBase: public Listener
{
public:
virtual void doSomething(void){ ...do something }
}

我的派生类使用protected继承 self 的AbstractBase:

class Derived: protected AbstractBase
{
public:
Derived(Caller &c){ c.register(this); }
}

我的 Caller 类通知注册事件的监听器:

class Caller
{
public:
void register(Listener *listenerPtr){...add listenerPtr to some container }
void raiseEvent(){...loop over registered listeners and call listenerPtr->doSomething();}
}

然后我按以下方式使用这些类:

int main(void)
{
Caller caller;
Derived derived(caller); // derived registers with caller in its constructor
caller.raiseEvent();
}

在上面的代码中,我看到 raiseEvent() 被允许调用 listener.doSomething()。但是,因为我将 Derived 的实例注册为监听器,所以 doSomething() 不应该受到保护(因此无法从 Caller 调用),因为它通过 protected 继承从 AbstractBase 继承了它的实现?

最佳答案

访问控制基于静态 类型,而不是动态类型。因此,由于您的 Caller 使用指向 Listener 的指针,它可以使用 Listener 类定义的接口(interface)。如果它收到一个指向 Derived 的指针,它仍然基本上将其视为一个 Listener,因此从它的角度来看,doSomething() 是公开的,不管派生类会做什么。

顺便说一句,对于使用protected 继承,我会重新考虑一下。我还没有看到或听说过对它的真正含义的很好解释,或者对您何时或为什么要使用它的合理解释。在 D&E 中,Bjarne 说 (§13.9):

Protected base classes were first described in the ARM and provided in Release 2.1. In retrospect, I think that protected is a case where "good arguments" and fashion overcame my better judgement and my rules for accepting new features.

关于c++ - protected 继承是可传递的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4159350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com