【发布时间】:2010-11-11 21:16:46
【问题描述】:
假设我有一个监听器接口定义为:
class Listener
{
public:
virtual void doSomething(void) = 0;
}
还有一个从我的接口公开继承的抽象类:
class AbstractBase: public Listener
{
public:
virtual void doSomething(void){ ...do something }
}
我的派生类使用 protected 继承从我的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 调用),因为它通过受保护的继承从 AbstractBase 继承了它的实现?
【问题讨论】:
-
大概
Listener::doSomething()应该是虚拟的吧?
标签: c++ inheritance