我有一个抽象基类Node
,它是从一个抽象接口类IObservable
继承而来。有几个类实现了抽象的IObservable
: SingleObservable
和MultiObservable
。
我想创建一个类ObservableNode
,它从基类Node
派生,并在其声明中指定用于IObservable
接口实现的类。
我已经为IObservable
中的每个纯虚方法添加了using ...
语句,引用了实现类中的方法,但我仍然收到错误消息,说ObservableNode
是一个抽象类,缺少notifyObservers(IObject*)
的实现。
如果我将参数IObject*
添加到using
语句中,我会得到一个"expected ';' before '(' token"错误。
如何解决这个问题?
class IObservable {
public:
virtual ~IObservable() {};
virtual void notifyObservers(IObject*) = 0;
};
class SingleObservable: public IObservable {
public:
virtual ~SingleObservable() {};
void notifyObservers(IObject*) override {
//some implementaiton
};
};
class MultiObservable: public IObservable {
public:
virtual ~MultiObservable() {};
void notifyObservers(IObject*) override {
//some other implementaiton
};
};
class Node: public IObservable {
public:
virtual ~Node() {};
};
class ObservableNode: public Node, public SingleObservable {
public:
virtual ~ObservableNode() {};
using SingleObservable::notifyObservers;
// using SingleObservable::notifyObservers(IObject*); // expected ';' before '(' token error
};
Node* node = new ObservableNode() // instantiating abstract class error, missing notifyObservers(IObject*) implementation
Node* node = new ObservableNode();
意味着node->notifyObservers(obj)
将调用Node::notifyObservers(IObject*)
而不是SingleObservable::notifyObservers(IObject*)
,这可能会出乎意料,考虑到我们实例化了一个指定了using SingleObservable::notifyObservers;
的ObservableNode
对象。OP 可能想要的是,在ObservableNode
中定义一个notifyObservers(IObject*)
重载,它明确地转发到SingleObservable::notifyObservers(IObject*)
。 - dfribnode->notifyObservers(obj)
,则会沿着虚函数表向下到达ObservableNode::notifyObservers(IObject*)
,然后通过转发显式地向上到达SingleObservable::notifyObservers(IObject*)
。 - dfrib