J'ai une classe de base avec une fonction virtuelle: et une classe de modèle dérivée: p> existe un moyen de Faire fonctionner () code> être tiré de la classe de base pour tous les types, à l'exception des éléments choisis? Donc, ce que je veux, c'est de pouvoir définir une fonction de remplacement
() code> pour, dire,
int code> et
long code>: p>
overriden version 1
overriden version 2
default version
3 Réponses :
Oui, en spécialisant schéma simple, mais cela fonctionne. P> dérivé code>. p>
base code>) li>
dérivé code> pour remplacer li>
ul>
Les fonctions de membre des modèles de classe sont en fait des modèles de fonction, de sorte que vous pouvez les spécialiser:
template <typename T> class Foo { void Function(); }; template <typename T> void Foo::Function() { /* ... */ } template <> void Foo<int>::Function() { /* ... */ }
Si vous l'appliquez dans le problème d'origine, le non spécifié Dérive :: fonction () code> serait défini mais simplement appeler
base :: fonction () code>.
i Utilisez le STRY> NOTE: FORT> Pour utiliser le deuxième solution strong> (Utilisation de spécialisations de modèle) : strong> P> typeid code>) : strong>
Typeid code> Opérateur pour vérifier si T est un
int code> ou un
long int code>, et si c'est le cas, je imprime "la version ultérieure de la version [numéro]". Si ce n'est pas le cas, j'appelle
base :: Fonction () code>, qui imprimera "Version par défaut" p>
Typeid code> Opérateur Vous devez inclure le fichier d'en-tête
typeinfo code> p>
// class declarations as before
template<typename T>
void Derived<T>::Function()
{
Base::Function(); // call default version
}
template<>
void Derived<int>::Function()
{
cout << "overriden version 1\n";
}
template<>
void Derived<long>::Function()
{
cout << "overriden version 2\n";
}
int main()
{
Derived<int> di;
Derived<long> dl;
Derived<float> df;
di.Function();
dl.Function();
df.Function();
return 0;
}
L'OMI implémente une fonction virtuelle utilisant ELLE-IF-Heimer's est un pas en arrière.