Вызов переопределенной функции из базового класса? - PullRequest
5 голосов
/ 02 ноября 2010

Мой вопрос, вероятно, лучше всего объяснить на примере.

Например, у меня есть 2 класса: базовый класс и производный класс:

class baseClass
{
public:
    baseClass()
    {
        foo();
    }
    virtual bool foo() { printf("baseClass"); return false;}

};

class derivedClass : public baseClass
{
public:
    bool foo()
    {
        printf("derivedClass");
        return true;
    }

};

Когда я создаю экземпляр derivedClass, будет вызываться конструктор в baseClass, а из его конструктора будет вызываться foo(). Проблема в том, что конструктор baseClass вызывает свой собственный foo(), а не переопределенный foo(), который переопределил производный класс. Есть ли способ заставить baseClass вызывать переопределенную функцию, а не ее собственное определение функции?

Ответы [ 2 ]

18 голосов
/ 02 ноября 2010

Вы не должны вызывать виртуальный метод из конструктора, потому что объект еще не был полностью построен. По сути, производный класс еще не существует, поэтому его методы не могут быть вызваны.

0 голосов
/ 02 ноября 2010

В большинстве языков это поведение либо запрещено, либо не определено по уважительной причине.

Учтите следующее: конструктор базового класса запускается перед конструктором подкласса, поэтому любые переменные, определенные подклассом, будут неинициализированы.Вы уверены, что хотите вызвать метод подкласса в этих обстоятельствах?

Самая простая альтернатива - определить метод initialize () в вашем суперклассе, а затем просто не забудьте вызвать initialize () из конструктора подкласса.

...