Na ostatnich inżynierskich targach pracy i praktytk trafiłem na dość trudny test z C++. Pojawiło się na nim zadanie co do którego miałem wątpliwości szczególnie że sprawdzający stwierdził że nie mam racji. Treść zapamiętałem i postanowiłem sprawdzić nie teoretycznie na kartce, ale po prostu jak się zachowa prawdziwy kompilator. Treść jest bardzo prosta, jaki będzie efekt kompilacji i uruchomienia poniższego kodu:

class A
{
public:
  A() {
    fun();
  }

  virtual void fun()  {
    std::cout << "A::fun" << std::endl;
  }

  void fun2()  {
    fun();
  }
};

class B : public A
{
  void fun()  {
    std::cout << "B::fun" << std::endl;
  }
};

int main() {
  A* a = new B();
}

Poprawna odpowiedź:
A::fun
dlaczego? W konstruktorze nie działa wirtualność. Zatem to ja miałem racje !
Za to gdyby dopisać jeszcze

a->fun2();

to byśmy zobaczyli już B::fun. Problem zapewne rzadko w praktyce występuje ale jest to genialne zadanie na wszelkiej maści testy mające sprawdzić zaawansowaną znajomość mechanizmów języka C++