pamiętnik programisty

28 mar, 2009

Z C++ zagadka

Zamieszczony przez: pejotr w: C++|Programowanie

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++

1 odpowiedź na "Z C++ zagadka"

1 | Jarek

1. Kwiecień 2009 o 09:21

Avatar

Sam pomysł wywoływania funkcji wirtualnej w konstruktorze lub desktuktorze zły. Zasada 9 (chyba) z Effective C++ Scotta Meyers’a mówi mniej więcej tyle :

Never call virtual functions during construction or destruction because the calls won’t do what you think, and if they did,
you’d still be unhappy.

Formularz komentarza

*

O mnie:

pejotrWitam, nazywam się Piotr Doniec, w internecie występuję pod nickami 'pejotr' oraz 'doniczek'. Obecnie jestem studentem 3 roku informatyki na Politechnice Warszawskiej na wydziale Elektroniki i Technik Informacyjnych.

Kategorie