Konstruktorból hívott virtuális függvény

Mi a hiba az alábbi kódrészletben?

class A

{

      A()

      {

            f();

      };

      virtual int f()=0;

};

           

class B: public A

{

      int f()

      {

            return 0;

      }

};

...

B b;

 





A megoldásért kattints ide!
Az ősosztály konstruktorának hívásakor még nem állítódnak át a virtuális függvénytábla (v.ö. SzC++Ny 7.3) pointerei (v.ö. SzC++Ny 7.6). Ezért az ősosztály függvénye hívódik meg, amely valamilyen fordítási idejű hibát ad.



2008.02.06. 20:45:20 |  Permalink  |  Hozzászólások száma: 1  |  Tárgyszavak: Polimorfizmus


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások


Dániel Dániel  (2016.02.16. 2:44:21)

Fordítási idejű hiba!!! Az ősosztály privát tagjait csak az ősosztály nem privát tagjain keresztül tudja elérni a leszármazott osztály. Alapértelmezetten implicite a nulla argumentummal meghívható konstruktor meghívja a szülőosztálya nulla argumentummal meghívható konstruktorát, ami jelen esetben privátnak lett deklarálva. Ha a publikusnak deklaráljuk, megszűnik a fordítási idejű hiba, de nem futási hiba lép a helyébe, hanem linkelési, amennyiben a tisztán vitruális függvény nem definiált. Lehet definiált, sőt, igényes kódokban nagyon gyakran definiált a tisztán virtuális függvény, mert egyszerű virtuális függvények helyett is azt használják, hogy az osztályt felhasználó, belőle leszármaztató felhasználó tudatos döntést kelljen, hogy hozzon az örökölt függvény felkínált implementációjának elfogadásáról.