Как выполнить конкретные задачи для каждого подкласса в конструкторе базового класса - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть базовый класс.Например:

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 ]

1 голос
/ 11 апреля 2019

Проблема в том, что вы вызываете виртуальную функцию из конструктора - вам следует избегать этого. Вместо этого вам нужно добавить в базовый класс функцию, которая будет вызывать ваши виртуальные функции, что в итоге приведет к вызову переопределенной функции дочернего класса. Таким образом я изменю ваш базовый класс следующим образом:

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;
};
0 голосов
/ 11 апреля 2019

Создайте разные конструкторы в базовом классе, затем в подклассе вызовите соответствующий конструктор. Или используйте аргументы по умолчанию, которые меняются соответствующим образом.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...