Ultima modifica:
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):
Come potete intuire dal commento, la funzione
Ho anche provato a rendere
Quindi mi chiedo, com'è possibile fare una cosa del genere ?
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();
}
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();
}
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();
}