问题是:ExampleIt
从It
类继承(并覆盖方法),以便当我在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();
};
};
template <typename Base>
class Wrapped: Base {
public:
std::pair<int, std::string> operator*() const {
return Base::dereference();
};
};
使用此选项,您甚至不需要
It
和ExampleIt
进行关联;任何具有dereference()
方法的类都可以。