субота, 26. фебруар 2011.

позивање виртуелне функције из деструктора базне класе

Данас сам имао краткотрајно помрачење ума. Покушао сам нешто што не може да ради. Чак сам се и збунио, а волим да верујем да познајем Ц++. Све је релативно, а знање нарочито.

Ради се о следећем:





class Base
{
public:
   virtual ~Base() { foo(); }

   virtual void foo() = 0;
};

class Derived
{
public:
   virtual void foo() { cout << "Derived::foo" << endl; }
};


Солидан компајлер ће дати упозорење. У зависности од верзије gcc и binutils прављење извршне датотеке може да успе, можда не. У сваком случају, ово је погрешно из простог разлога што у тренутку када деструктор класе Base позове функцију foo, изведена класа Derived је већ извршила свој деструктор и подаци у тој класи су већ уништени. Ако би компјалер дозволио позив виртуелне фунције из деструктора Base, довео би до ситуације да виртуелна функција изведене класе барата са подацима који су већ били уништени.

Нема коментара:

Постави коментар