我想为我的 Source-Plugins 建立一个工厂,如下所示:
class PluginFactory {
public:
PluginFactory(){};
virtual ~PluginFactory(){};
static MySource* getSourceById(int id, ParameterList& pList){
switch (id){
case 1:
return new StringSource(pList);
default:
std::cout << "Unknown PluginId!" << std::endl;
return nullptr;
}
}
};
MySource
在模式中不能像往常一样抽象,因为它稍后将在模板类中使用。
当我调用返回的方法时,MySource*
我得到的是超类的方法,MySource
而不是子类的重写方法StringSource
。
任何想法如何解决这一问题?
编辑:
我将超类方法声明为虚拟方法:
MySource{
...
virtual std::streamsize read(char* s, std::streamsize n){
...
}
};
我将覆盖命令添加到子类的读取方法中:
class StringSource: public MySource {
...
std::streamsize read(char* s, std::streamsize n) override
{
...
}
};
但它仍然使用超类方法。一定还有别的原因……
顺便提一句。我将 Source-Class 放入 boost::iostream::filtering_istream 中,如下所示:
MySource* source = PluginFactory::getSourceById(1, pluginList[0].second);
boost::iostreams::filtering_istream in;
in.push(*source);
所以我自己不调用 read-method。