给定以下内容:

class Observer
{
    public:
        virtual void Observe(Parameter p) = 0;
};

template<size_t Tag>
class TaggedObserver : public Observer { };

class Thing : public TaggedObserver<0>, TaggedObserver<1>
{
    public:
        virtual void Observe(Parameter p) override;
};
Thing::Observe覆盖TaggedObserver<0>::ObserveTaggedObserver<1>::Observe
有没有办法为每个基类提供不同的替代?
原理:我希望该类能够观察两个相同类型的通知源,并且每个源具有不同的操作,而不必诉诸于在参数中传递源,然后在if/switch中对其进行检查。

最佳答案

为了提供不同的替代,您需要定义不同的派生类,例如:

class Observer
{
public:
    virtual void Observe(Parameter p) = 0;
};

template<size_t Tag>
class TaggedObserver : public Observer
{
};

class TaggedObserverZero : public TaggedObserver<0>
{
public:
    virtual void Observe(Parameter p)
    {
        // do something ...
    }
};

class TaggedObserverOne : public TaggedObserver<1>
{
public:
    virtual void Observe(Parameter p)
    {
        // do something else ...
    }
};

但是,如果希望Thing::Observe()首先接收Parameter并将其分派(dispatch)到适当的基类,则无法避免在if中使用Thing语句(或等效语句),因为它继承了TaggedObserver::Observe()的多个拷贝,并且需要确定要复制哪个称呼:
class Thing : public Observer, TaggedObserverZero, TaggedObserverOne
{
public:
    virtual void Observe(Parameter p)
    {
        if (some condition)
            TaggedObserverZero::Observe(p);
        else if (some other condition)
            TaggedObserverOne::Observe(p);
    }
};

或者,您无条件地仅将它们都调用,然后让他们找出要做什么:
class TaggedObserverZero : public TaggedObserver<0>
{
public:
    virtual void Observe(Parameter p)
    {
        if (some condition)
            // do something ...
    }
};

class TaggedObserverOne : public TaggedObserver<1>
{
public:
    virtual void Observe(Parameter p)
    {
        if (some other condition)
            // do something else ...
    }
};

class Thing : public Observer, TaggedObserverZero, TaggedObserverOne
{
public:
    virtual void Observe(Parameter p)
    {
        TaggedObserverZero::Observe(p);
        TaggedObserverOne::Observe(p);
    }
};

10-04 19:13