C++ 如何委托给实现类

C++ 如何委托给实现类,c++,C++,我有一个抽象基类节点,它派生自一个抽象接口类IObservable。 有几个类实现了抽象的ioobservable:SingleObservable和MultiObservable 我想创建一个类observeNode,该类派生自基本节点类,并在其声明中指定用于实现IObservable接口的类 我已经为IObservable中的每个纯虚拟方法添加了语句,引用了实现类中的方法,但是我仍然收到错误,说observeNode是一个抽象类,缺少notifyObservators(IObject*)的实

我有一个抽象基类
节点
,它派生自一个抽象接口类
IObservable
。 有几个类实现了抽象的
ioobservable
SingleObservable
MultiObservable

我想创建一个类
observeNode
,该类派生自基本
节点
类,并在其声明中指定用于实现
IObservable
接口的类

我已经为
IObservable
中的每个纯虚拟方法添加了
语句,引用了实现类中的方法,但是我仍然收到错误,说
observeNode
是一个抽象类,缺少
notifyObservators(IObject*)
的实现

如果我使用
语句将参数
ioobject*
添加到
中,我会得到一个“预期的”;“before”(“令牌”错误)

我怎样才能解决这个问题

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

您的问题似乎是继承了仍然是抽象的
节点
,这也导致引入了好的旧问题。当我这样更改您的代码时,错误消失了:

class Node: public IObservable {
  public:
    virtual ~Node() {};
    // ** Added an implementation here **
    void notifyObservers(IObject*) override { 
          //some other implementaiton
    };
};

class ObservableNode: public virtual Node, public virtual SingleObservable {
                          // ^^^^^^^              ^^^^^^^
  public:
    virtual ~ObservableNode() {};
    using SingleObservable::notifyObservers;
};

int main() {
    Node* node = new ObservableNode();
}
请参见。

描述一种解决方法,但可能这不是OP在此之后的内容。此外,答案中的方法可能会产生意外结果,例如,在调用
节点->通知观察者(obj)
时:


请注意,在这个特定示例中,
Node*Node=new
ObserveNode();
将意味着
节点->通知观察者(obj)
将调用
Node::notifyobserver(IObject*)
而不是
SingleObservable::notifyObservers(IOObject*)
,可能是 意外,考虑到我们实例化了一个
可观测节点
对象 它指定使用
singleobservate::notifyobservators;

在OP的原始代码中,我们正遭受多重继承歧义,因为当
节点
单可观察
(和
多可观察
)从
IObservable
派生时,我们使用
虚拟
继承

这意味着我们的w.r.t.继承,
observeNode
to如下所示

 IObservable  IObservable
           |  |
        Node  SingleObservable
           \  /
       ObservableNode
然而,在此上下文中,我们可能希望对象的内存布局如下所示

       IObservable
           /  \
        Node  SingleObservable
           \  /
       ObservableNode
如果我们要纠正这一点,
Node
可以保持抽象,并且以
Node
为例调用
Node->notifyObservators(obj)
将导致调用
SingleObservable::notifyObservators
,这可能是意料之中的

class Node: public virtual IObservable {
                // ↑↑↑↑↑↑↑
  public:
    virtual ~Node() {};
};

class SingleObservable: public virtual IObservable {
                            // ↑↑↑↑↑↑↑
  public:
    virtual ~SingleObservable() {};
    void notifyObservers(IObject*) override { 
        std::cout << "SingleObservable::notifyObservers";
    };
};

struct DummyObj : public IObject {};

int main() {
    Node* node = new ObservableNode();
    DummyObj obj;
    node->notifyObservers(obj);  // SingleObservable::notifyObservers
}

有关菱形继承结构和虚拟继承的详细信息,请参见。

感谢所有建议!实现这些会给已经使用
可观察的
实现的其他类带来许多其他问题,因此我选择以不同的方式解决它,包括一个实现实例和委派所有方法都适用于该方法

class IObject {
    public:
    virtual ~IObject() {};
};

class IObservable {
  public:
    virtual ~IObservable() {};
    virtual void notifyObservers(IObject*) = 0;
};

class SingleObservable: public IObservable {
  public:
    virtual ~SingleObservable() {};
    void notifyObservers(IObject*) override { 
        std::cout << "Single\n";
      //some implementaiton
    };
};

class MultiObservable: public IObservable {
  public:
    virtual ~MultiObservable() {};
    void notifyObservers(IObject*) override { 
        std::cout << "Multi\n";
      //some other implementaiton
    };
};

class Node: public IObservable {
  public:
    virtual ~Node() {};
    // void notifyObservers(IObject*) override { };
};

class SingleObservableNode: public Node {
  public:
    SingleObservableNode() {};
    virtual ~SingleObservableNode() {
        delete obs;
    };
    void notifyObservers(IObject* obj) override { 
        obs->notifyObservers(obj);
    }
    private:
     IObservable* obs = new SingleObservable();
};


class MultiObservableNode: public Node {
  public:
    MultiObservableNode() {};
    virtual ~MultiObservableNode() {
        delete obs;
    };
    void notifyObservers(IObject* obj) override { 
        obs->notifyObservers(obj);
    }
    private:
     IObservable* obs = new MultiObservable();
};

Node* node1 = new SingleObservableNode(); 
Node* node2 = new MultiObservableNode(); 

int main()
{
    node1->notifyObservers(nullptr);   // "Single"
    node2->notifyObservers(nullptr);   // "Multi"
   return 0;
}
类IOObject{
公众:
虚拟~IObject(){};
};
类IObservable{
公众:
virtual~IObservable(){};
虚拟对象(IOObject*)=0;
};
类SingleObservable:公共IObservable{
公众:
虚拟~SingleObservable(){};
void notifyObserver(IOObject*)重写{
std::cout-notify-obj;
}
私人:
IObservable*obs=新的多可观测();
};
Node*node1=新的SingleObservableNode();
Node*node2=新的多观测节点();
int main()
{
node1->notifyobserver(nullptr);/“单个”
node2->notifyobserver(nullptr);/“多”
返回0;
}

@Scheff-THX采用了它。不从
IObservable
继承
Node
肯定是另一种解决方案。您仍然可以将其作为答案发布。这确实解决了问题,谢谢!事实上,我确实希望节点定义中的IObservable接口注意,在这个特定示例中,
Node*Node=new ObservableNode();
将意味着
节点->通知观察者(obj)
将调用
节点::通知观察者(IObject*)
而不是
单观察者::通知观察者(IObject*)
,考虑到我们实例化了一个
observeNode
对象,该对象使用SingleObservable::notifyObservators;
指定
。OP可能希望在
observeNode
中定义一个
notifyObservators(IOObject*)
override,它明确地转发给
SingleObservable::notifyobservators(IObject*)
@Bascy您应该知道前面的评论。您仍在努力解决菱形歧义问题,可能会得到意外的结果……然后调用
node->notifyobservators(obj)
将沿着vtable向下移动到
observeNode::notifyObservators(IObject*)
,然后从那里明确地移动到(通过转发)
SingleObservable::notifyObservators(IObject*)
class Node: public virtual IObservable {
  public:
    virtual ~Node() {};
    void notifyObservers(IObject*) override { 
        std::cout << "Node::notifyObservers";
    };
};

class SingleObservable: public virtual IObservable {
  public:
    virtual ~SingleObservable() {};
    void notifyObservers(IObject*) override { 
        std::cout << "SingleObservable::notifyObservers";
    };
};

class ObservableNode: public Node, public SingleObservable {
  public:
    virtual ~ObservableNode() {};
    // Non-ambiguous final override in ObservableNode.
    // We could use `override` specifier here, but we might as well
    // use `final`, if we are not expecting something to derive from ObservableNode.
    void notifyObservers(IObject* obj) final { 
        SingleObservable::notifyObservers(obj);
    };
};

struct DummyObj : public IObject {};

int main() {
    Node* node = new ObservableNode();
    DummyObj obj;
    node->notifyObservers(obj);  // SingleObservable::notifyObservers
}
class IObject {
    public:
    virtual ~IObject() {};
};

class IObservable {
  public:
    virtual ~IObservable() {};
    virtual void notifyObservers(IObject*) = 0;
};

class SingleObservable: public IObservable {
  public:
    virtual ~SingleObservable() {};
    void notifyObservers(IObject*) override { 
        std::cout << "Single\n";
      //some implementaiton
    };
};

class MultiObservable: public IObservable {
  public:
    virtual ~MultiObservable() {};
    void notifyObservers(IObject*) override { 
        std::cout << "Multi\n";
      //some other implementaiton
    };
};

class Node: public IObservable {
  public:
    virtual ~Node() {};
    // void notifyObservers(IObject*) override { };
};

class SingleObservableNode: public Node {
  public:
    SingleObservableNode() {};
    virtual ~SingleObservableNode() {
        delete obs;
    };
    void notifyObservers(IObject* obj) override { 
        obs->notifyObservers(obj);
    }
    private:
     IObservable* obs = new SingleObservable();
};


class MultiObservableNode: public Node {
  public:
    MultiObservableNode() {};
    virtual ~MultiObservableNode() {
        delete obs;
    };
    void notifyObservers(IObject* obj) override { 
        obs->notifyObservers(obj);
    }
    private:
     IObservable* obs = new MultiObservable();
};

Node* node1 = new SingleObservableNode(); 
Node* node2 = new MultiObservableNode(); 

int main()
{
    node1->notifyObservers(nullptr);   // "Single"
    node2->notifyObservers(nullptr);   // "Multi"
   return 0;
}