Вызов виртуальной функции из конструктора
я читаюЭффективный 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
Таким образом, я получаю A, когда он создается, и B регистрируется, когда он создается. И это то, что яхотеть! Но я спрашиваю, не нашли ли вы что-то не так (потенциально опасное) с моим "хаком", чтобы преодолеть проблему с вызовом виртуальной функции в конструкторе.