如何在基类构造函数中为每个子类执行特定任务

时间:2019-04-11 10:11:59

标签: c++ base-class pure-virtual

我有一个基础课。例如:

class CData{
public:
    CData(const std::string &_filename)
    {
        m_filename = _filename;
        // LodaData(); // wrong
    }

    virtual void LoadData() = 0;
private:
    std::string m_filename;
};

还有一个子类:

class COtherData: public CData{
public:
    COtherData(const std::string &_filename): CData(_filename) {}

    virtual void LoadData() {
    // some code to load data
    ...
    }
};

我想知道如何在基类中为子类执行一些任务。

2 个答案:

答案 0 :(得分:1)

问题是您从构造函数调用了虚函数-应该避免使用它。相反,您需要在基类中添加一个函数,该函数将调用您的虚函数,最终将导致调用子类的重写函数。 因此,我将通过以下方式更改您的基类:

class CData
{
public:
    CData(const std::string &_filename)
        : m_filename(_filename)
    {}

    void performTask()
    {
        LoadData();
        // ... do something else
    }

    virtual void LoadData() = 0;
private:
    std::string m_filename;
};

答案 1 :(得分:0)

在基类中创建不同的构造函数,然后在子类中调用适当的构造函数。或使用适当更改的默认参数。

class A  
{  
   A(int a = 0) 
   {
        if(a == 0) // first case
        else // second case
   }

};

class B : public A 
{
    B() : A(0) {} // First case
    --- or --- 
    B() : A(1) {} // Second case
}