Im чтение this статьи о конструкторах для C++C++ виртуальной функции в конструкторе
Мы рекомендуем вам быть осторожными при вызове виртуальной функции в конструкторах. Поскольку конструктор базового класса всегда вызывается перед конструктором производного класса, функция, которая вызывается в , базовым конструктором является версия базового класса, а не производный класс . В следующем примере построения DerivedClass вызывает реализацию BaseClass из PRINT_IT(), чтобы выполнить перед DerivedClass конструктор вызывает реализацию DerivedClass из PRINT_IT() для выполнения:
пример:
class BaseClass {
public:
BaseClass() {
print_it();
}
virtual void print_it() {
cout << "BaseClass print_it" << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {
print_it();
}
virtual void print_it() {
cout << "Derived Class print_it" << endl;
}
};
int main() {
DerivedClass dc;
}
Вот результат:
BaseClass print_it
Derived Class print_it
I tried this code and the output is as stated above. Однако я также попробовал тот же самый пример без виртуального ключевого слова:
class BaseClass {
public:
BaseClass() {
print_it();
}
void print_it() {
cout << "BaseClass print_it" << endl;
}
};
class DerivedClass : public BaseClass {
public:
DerivedClass() {
print_it();
}
void print_it() {
cout << "Derived Class print_it" << endl;
}
};
int main() {
DerivedClass dc;
}
Так в чем же разница и в чем опасность, о которой они предупреждают?
@marked в двух экземплярах:
Этот вопрос отличается как consturctors как вызвать виртуальный метод вместо одного конструктора, вызывающего виртуальный метод.
Опасность: в конструкторах и деструкторах виртуальные функции не являются (виртуальными). –
Не совсем правильно. Они являются виртуальными, но когда выполняется конструктор, * это экземпляр класса запущенного конструктора, а не экземпляр класса, к которому он в конечном итоге принадлежит. Итак, какой конструктор запускается, может быть неожиданным. – gnasher729
@ gnasher729 Не могли бы вы объяснить, что им следовало ожидать, потому что я ожидал этого результата и не вижу опасности. Не зная, что другие ожидают, может оказаться в недоразумениях. –