c++ - 子类中的方法不会被父类中的虚函数调用

标签 c++ virtual-functions

在我的应用程序中,我有几个读取器从 .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/

相关文章:

c++ - 如何在 swift 项目中使用 c++ 库来制作更好的 glsl 编译器

c++ - #pragma 警告 - 文件特定?

数组的 C++ 构造函数初始值设定项

c++ - 关于虚拟方法的问题

c# - 在方法覆盖中更改 params 修饰符

c++ - 派生的、具体的、类的虚表

c++ - 寻找数组中的平衡点

c++ - 重用 "rechnung()"即使它不应该

c++ - 在成员函数中调用虚函数

c++ - 当对象具有值语义时,在方法中内联虚函数