2010-11-01 2 views
5

Мой вопрос, вероятно, лучше всего объясняется примером.Вызов переопределенной функции из базового класса?

К примеру, у меня есть 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 вызывал переопределенную функцию, а не ее собственное определение функции?

ответ

17

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

+0

+1: Конструкторы являются особенными и сложными;) – James

+0

Спасибо за ответ! Теперь я чувствую себя идиотом, потому что я должен был это знать уже. Спасибо:] – Brad

+2

Для того, чтобы сделать что-то подобное, см. C++ FAQ Lite 23.6: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.6 – aschepler

0

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

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

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