2010-06-19 2 views
5
class Base { 
    public: 
    Base() {} 

    void Foo(int x) {...} 
}; 

class Derived : public Base { 
    public: 
    Derived(int args) { 
     /* process args in some way */ 

     Foo(result); 
    } 
}; 

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

ответ

11

Разрешено ли вызывать метод базового класса в конструкторе производного класса?

Да. Просто следите за функциями virtual. Если класс, полученный из Derived, переопределяет виртуальную функцию, при построении Derived в качестве под-объекта этого дополнительного производного класса динамический тип всегда равен Derived, поэтому виртуальные функции, переопределенные в других производных классах, не вызываются. (То же самое касается деструктора, BTW.)

Я бы предположил, что это нормально, поскольку базовый объект должен быть полностью построен, но я хотел проверить на всякий случай.

Ваши аргументы верны.

1

Существует опасность, когда:
1. метод переопределяется
2. метод вызывает другие методы, которые переопределены

+2

Это просто неправильно. Нет проблем с перегруженными функциями и конструкторами. Вы имеете в виду _overridden_? (И если да, не забывайте, что это относится только к виртуальным функциям.) – sbi

+0

upvoted (и ответ sbi тоже), но вы имеете в виду «переопределенный», а не «перегруженный» – tpdi

+0

sbi, в защите adf88 переопределенный подразумевает виртуальный (как в противном случае это скрыто, а не переопределено и, вероятно, ошибка). – tpdi