Я читаю Effective C++, и есть «Пункт 9: Никогда не вызывайте виртуальные функции во время строительства или разрушения». И мне интересно, если мой код хорошо, даже если он нарушает это правило:Вызов виртуальной функции от конструктора
using namespace std;
class A{
public:
A(bool doLog){
if(doLog)
log();
}
virtual void log(){
cout << "logging A\n";
}
};
class B: public A{
public:
B(bool doLog) : A(false){
if(doLog)
log();
}
virtual void log(){
cout << "logging B\n";
}
};
int main() {
A a(true);
B b(true);
}
там что-то не так с этим подходом? Могу ли я попасть в беду, когда я делаю что-то более сложное?
Мне кажется, что большинство ответов не получили то, что я там сделал, и они просто объяснили, почему вы вызываете виртуальную функцию из конструктора потенциально опасной.
Я хотел бы подчеркнуть, что выход моей программы выглядит следующим образом:
logging A
logging B
Так я получаю вошедшие, когда он построен и B регистрируется, когда он построен. И это то, что я хочу хочу! Но я спрашиваю, находите ли вы что-то неправильное (потенциально опасное) с моим «взломом», чтобы преодолеть проблему с вызовом виртуальной функции в конструкторе.
В этом случае вы исправили его хорошо, но если другим людям необходимо использовать этот код, ошибки должны произойти. –
@JoachimPileborg это не так: поведение * определено *. Во время строительства вызовы виртуальных функций отключены (например, используется реализация используемого в настоящее время типа). –