问题是:ExampleItIt类继承(并覆盖方法),以便当我在Wrapped类中重载运算符时(该操作符从It调用某些方法,应该由ExampleIt覆盖)。

所需的效果是,当我重载operator*时,我应该能够调用*name_of_Wrapped_class,并且应该执行虚拟方法dereference(来自It),该方法应由ExampleIt覆盖。

class It {
public:
    virtual std::pair<int, std::string> dereference() const;
};

class ExampleIt : It {
public:
    std::pair<int, std::string> dereference() const override;
};

class Wrapped : It{ //??? not sure about that
public:
     std::pair<int, std::string> operator*() const; // it should call for dereference()
};

最佳答案

在实际回答之前,我不得不说您的类(class)层次结构和命名似乎有点可疑。您的解引用运算符返回一个值而不是引用-这不是在普通指针上进行解引用的方式。

不过,您仍然要求它,所以就在这里。有两种方法可以实现operator*()重载(每种方法都有其优缺点,在此不再赘述):

  • 运行时多态行为,使用指针:
    class Wrapped {
    protected:
        It* it;
    public:
        std::pair<int, std::string> operator*() const {
            return it->dereference();
        };
    };
    
  • 使用Curiously Recurring Template Pattern (CRTP)的编译时多态性:
    template <typename Base>
    class Wrapped: Base {
    public:
        std::pair<int, std::string> operator*() const {
            return Base::dereference();
        };
    };
    

    使用此选项,您甚至不需要ItExampleIt进行关联;任何具有dereference()方法的类都可以。
  • 10-08 07:55