Stai usando un browser non aggiornato. Potresti non visualizzare correttamente questo o altri siti web. Dovreste aggiornare o usare un browser alternativo.
Salve, mentre tentavo di affinare le mie abilità creando un costrutto di classi meta-programmate assieme ai concetti di ereditarietà mi sono imbattuto in questa stranezza (è una versione semplificata di ciò che sto cercando di fare):
C++:
#include <iostream>
template<class T>
class BASE
{
public:
void func()
{
std::cout << "Hello world";
}
};
template<class T>
class DERIVED : public BASE<T>
{
public:
void func2()
{
func(); // <-- 'func': identificatore non trovato
}
};
int main()
{
DERIVED<int> obj;
obj.func2();
}
Come potete intuire dal commento, la funzione func(); inclusa nell'ambito di func2(); non viene riconosciuta, mentre nel caso di una classe non meta-programmata il codice verrebbe compilato senza errori:
C++:
#include <iostream>
class BASE
{
public:
void func()
{
std::cout << "Hello world";
}
};
class DERIVED : public BASE
{
public:
void func2()
{
func();
}
};
int main()
{
DERIVED obj;
obj.func2();
}
Ho anche provato a rendere func2(); una virtualizzazione di func();, ma la chiamata di funzione func(); da origine ad un buffer overflow.
C++:
#include <iostream>
template<class T>
class BASE
{
public:
virtual void func()
{
std::cout << "Hello world";
}
};
template<class T>
class DERIVED : public BASE<T>
{
public:
void func() override
{ // Buffer overflow
func();
}
};
int main()
{
DERIVED<int> obj;
obj.func();
}
Quindi mi chiedo, com'è possibile fare una cosa del genere ?