PDA

View Full Version : [C++] Ereditarieta e template....... problemi..


tglman
17-11-2007, 01:19
Ho un problemino c++ con i template .... è un pò complesso ....
Allora ho un'interfaccia

class I
{
public:
void fI()=0;
};

una seconda interfaccia che eredita del comportamento dalla prima.

class I2:public I
{
public:
void fI2()=0;
};

Ho l'implementazione della prima interfaccia.

class IImpl:public I
{
public:
void fI(){.....}
};


ho l'impementazione della seconda interfaccia che è un template....


template<typename T>
class I2Impl:public I2,public IImpl
{
public:
void fI2(){/*implementazione con template!!*/}
};


Cosi scrivendo al momento che andavo a istanziare il template il compilatore mi si arrabbiava e mi diceva che mancava l'implementazione di fi().... ma c'è .....

per farlo funzionare o duvuto fare:


template<typename T>
class I2Impl:public I2,public IImpl
{
public:
void fi(){IImpl::fi()}
void fI2(){/*implementazione con template!!*/}
};


Come mai ???
cosa c'è che mi sfugge ?? nn dovrei riscrivere la chiamata ad una funzione che gia ho!!

marco.r
17-11-2007, 12:06
Primo errore: devi dichiarare fI e fI2 virtual (virtual void fI()=0).
Probabilmente pero' e' solo un errore di trascrizione.
Il motivo principale per cui non funziona e' pero' dovuto la fatto che quando hai derivato da I non hai specificato
la derivazione di tipo virtual

class I2 : virtual public I {
...

Facendo cosi', quando poi derivi sia da I2 che da IImpl, ti trovo con due fI distinte ( I2::fI e IImpl::fI ) per cui ti in pratica in I2Impl implementi
solo una delle due e il compilatore si lamenta di questo.

tglman
17-11-2007, 15:11
Si in effetti ci sono una serie di errori di tracrizione ;).....

Ho messo i virtual .... ma nulla stesso problema ...

marco.r
17-11-2007, 16:35
#include <iostream>
using namespace std;


class I
{
public:
virtual void fI()=0;
};


class I2:virtual public I
{
public:
virtual void fI2()=0;
};

class IImpl:virtual public I
{
public:
void fI(){ cerr << "fI()" << endl;}
};


template<typename T>
class I2Impl:public I2,public IImpl
{
public:
void fI2(){ cerr << T(0) << endl; }
};



int main()
{
I2Impl<bool> x;
x.fI();
x.fI2();
}

Questo funziona, occhio che i secondi "virtual" di cui parlavo sono quelle nella dichiarazione della classe, non del metodo.

tglman
17-11-2007, 17:20
Grazie avevi ragione ...... avevo messo "virtual" solo sull'interfaccia figlia e non nell'implementazione adesso l'ho messo e funziona tutto grazie!!!