是否可以使用模板方法声明某种类型的基类,我可以在派生类中重写它?以下示例:
#include <iostream>
#include <stdexcept>
#include <string>
class Base
{
public:
template<typename T>
std::string method() { return "Base"; }
};
class Derived : public Base
{
public:
template<typename T>
std::string method() override { return "Derived"; }
};
int main()
{
Base *b = new Derived();
std::cout << b->method<bool>() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望Derived作为输出,但它是Base.我假设有必要创建一个模板化的包装类,它接收实现类作为模板参数.但我想确定一下.
我目前正在设计一个接口(Base在下面的例子中),它提供了几个虚拟方法,包括begin()和end()。这两个方法简单地返回相应的迭代器,就像在任何其他集合(如类)中一样。派生类应该实现这些方法并返回它们对迭代器的特定实现。
以下(简化的)示例显示了一个派生类,它使用 aboost::transform_iterator来转换整数的私有内部列表。这个实现只是现实中的一个例子,迭代的“事物”可以是其他东西,迭代器也是如此。
该示例有效,但我有一个问题。对象类型main()并没有隐藏使用的迭代器类型为 的事实TransformIterator。基类将用于某种插件架构,其中每个插件都是一个共享库。插件不应该知道使用哪种类型的迭代器,而应该完全依赖于抽象接口。有没有办法做到这一点?
#include <boost/iterator/transform_iterator.hpp>
#include <iostream>
#include <string>
#include <vector>
template<class Iterator>
class Base
{
public:
virtual Iterator begin() = 0;
virtual Iterator end() = 0;
};
struct toString
{
std::string operator()(int number) const
{
return std::to_string(number);
}
};
typedef boost::transform_iterator<toString, std::vector<int>::iterator> TransformIterator;
class Derived : public Base<TransformIterator>
{
public:
Derived() : ints{132, 3, 6451, 12, 5} {}
TransformIterator begin()
{
return boost::make_transform_iterator(ints.begin(), toString());
} …Run Code Online (Sandbox Code Playgroud)