PDA

View Full Version : [C++] errore vtable


doomer
23-11-2008, 14:58
se ho qualcosa del genere:
//in a.h
class A
{ public:
virtual int get() const;
}

//in b.h
class B : public A
{ public:
int get() const;
}

//in b.cpp
int B::get() const { ... }
mi da un errore riguardo la vtable..
se implemento in a.cpp il metodo get, che non faccia niente ad esempio così:
int A::get() const {}
mi da warning perchè non ritorno niente... ma io non voglio ritornare niente.. anzi perchè sono costretto a implementare il metodo in a.cpp? get mi serve solo perchè venga implementato dalle classi derivate.. e A non la voglio virtuale pura...
se faccio:
//a.cpp
int A::get() const {return 0}
probabilmente risolverei la cosa ma vorrei sapere se le cose stanno veramente così...

Tommo
23-11-2008, 15:11
Se proprio il metodo get non deve essere implementato in A, puoi fare così:



virtual int get() const=0;



In questa maniera:
-A non implementa get(),
-A diventa astratta, cioè non la puoi più istanziare
-avrai un errore se non implementerai get() nelle classi figlie

Altrimenti si, ti tocca mettere {return 0}...

doomer
23-11-2008, 15:26
Se proprio il metodo get non deve essere implementato in A, puoi fare così:



virtual int get() const=0;



In questa maniera:
-A non implementa get(),
-A diventa astratta, cioè non la puoi più istanziare
-avrai un errore se non implementerai get() nelle classi figlie

Altrimenti si, ti tocca mettere {return 0}...

eh ma come ho detto A non la voglio astratta...
vabbe metterò il return 0.. grazie

DoubleAJ
23-11-2008, 17:05
get mi serve solo perchè venga implementato dalle classi derivate..

.. e A non la voglio virtuale pura...

Beh, nella prima frase hai dato esattamente la definizione di metodo virtuale puro, poi subito dopo dici di non volere che sia un metodo virtuale puro...

Secondo me "= 0" è la migliore soluzione nel tuo caso.

doomer
23-11-2008, 18:42
Beh, nella prima frase hai dato esattamente la definizione di metodo virtuale puro, poi subito dopo dici di non volere che sia un metodo virtuale puro...

Secondo me "= 0" è la migliore soluzione nel tuo caso.

A in realtà ha altre variabili in private... e devo costruire degli oggetti di A.. poi ci sono le classi derivate da A a cui servono i metodi virtuali di A