Ho riscontrato un caso strano quando la parola chiave final
viene aggiunta a una dichiarazione di funzione virtuale, con la sua definizione su un file .cpp separato.
consideri il seguente esempio:Comportamento anomalo del finale su una funzione virtuale
IClass.hpp
class IClass //COM-like base interface
{
protected:
virtual ~IClass(){} //derived classes override this
public:
virtual void release() final;
};
dllmain.cpp (libreria condivisa)
#include "IClass.hpp"
...
void IClass::release()
{
delete this;
}
...
main.cpp (eseguibile standalone)
//various includes here
...
int main(int argc, char** argv)
{
/* From "IGameEngine.hpp"
class IGameEngine : public IClass
{
...
};
*/
IGameEngine* engine = factoryGameEngine();
...
engine->release();
return 0;
}
Così com'è, GCC 4.9.2 segnala un undefined reference to 'IClass::release()'
Il mio obiettivo è quello di avere IClass::release()
come non-override pur avendo la sua attuazione nascosto all'interno libreria condivisa del motore di gioco.
Qualche suggerimento?
Le funzioni virtuali vengono sempre utilizzate odr a meno che non siano puri. Credo che il linker sia autorizzato a emettere un errore in quel caso. – 0x499602D2
Non riesco a riprodurre il problema sul mio gcc 4.9.2. Per favore aggiungi come stai costruendo il tuo programma (opzioni del compilatore, ecc.) – dyp
Hai esportato la funzione dalla dll? @ 0x49 Avevo l'illusione che la loro odr-used-ness fosse definita dall'implementazione. – Yakk