在我的应用程序中,我有几个读取器从 .csv 文件中读取数据。我现在想通过为那些共同拥有方法 getData(std::string filename)
的读者创建一个父类来构建它们。我想通过在基类中实现一个虚方法来做到这一点。文件名应该由构造函数传递。
主要
int main()
{
std::string filename = "file.csv";
ChildReader1 reader = new ChildReader1(filename);
}
ChildReader1.h
class ChildReader1: public ParentReader
{
public:
ChildReader1(std::string filename)
: ParentReader(filename)
{
};
void getData(std::string filename)
{
//get the data here
}
};
ParentReader.h
class ParentReader
{
public:
ParentReader() {};
ParentReader(std::string filename)
{
getData(filename);
};
~ParentReader() {};
virtual void getData(std::string filename) {};
};
此时,filename 被传递给 ParentReader,但是 getData(filename) 打开了 ParentReader 中的虚拟方法,而不是 ChildReader 1 中的实际方法。我该如何解决这个问题?
最佳答案
您可以通过工厂解决您的问题:
class ParentReader
{
public:
virtual ~ParentReader() = default
virtual void getData(const std::string& filename) = 0;
};
template <typename T, typename ... Ts>
std::unique_ptr<T> MakeReader(const std::string& filename, Ts&&... args)
{
static_assert(std::is_base_of<ParentReader, T>::value, "!");
auto res = std::make_unique<T>(std::forward<Ts>(args)...);
res->getData(filename);
return res;
}
关于c++ - 子类中的方法不会被父类中的虚函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47307620/