【发布时间】:2020-07-19 17:57:07
【问题描述】:
我正在尝试实现不同版本的数据结构。假设它有一个如下所示的界面(已简化):
template <typename T>
class Base {
public:
class Iterator {
virtual auto operator*() -> T& = 0;
};
public:
virtual auto Find(const T& value) -> Iterator = 0;
}
现在我想继承一个实现它的类:
template <typename T>
class Derived : public Base<T> {
public:
class Iterator {
auto operator*() -> T& override {
/* ... */
}
};
public:
auto Find(const T& value) -> Iterator override {
/* ... */
};
}
问题是我需要根据Derived 的功能实现Iterator,但是Find 函数的签名因为Derived::Iterator 而停止(应该是Base::Iterator)。有没有办法这样做还是我必须放弃使用接口类?
【问题讨论】:
-
假设你设法以某种方式实现它。持有
Base<int>* pb指针(指向Derived<int>,或者可能是另一个实现)的调用者将如何使用Find?它会调用auto iter = pb->Find(42);- 现在呢?iter能做什么?你的设计没有说明。 -
抱歉,修复了
Iterator接口。现在调用者可以像这样取消引用iter:auto value = *iter;。 -
Find声称按值返回抽象类的实例。这不可能工作,因为不可能创建抽象类的实例。您提出的界面根本无法实现。
标签: c++ templates inheritance nested