Maison > Article > développement back-end > Erreur de syntaxe C++ : la fonction membre du modèle de classe ne peut pas être une fonction virtuelle, que dois-je faire ?
C++ est un langage de programmation largement utilisé. En tant que langage de programmation fortement typé, polyvalent et orienté objet, il est efficace, stable et évolutif. Dans le processus de programmation C++, l'utilisation de classes et de modèles peut nous aider à implémenter notre logique de code rapidement et efficacement. Cependant, certains problèmes peuvent être rencontrés dans le processus réel, comme le problème selon lequel les fonctions membres du modèle de classe ne peuvent pas être des fonctions virtuelles.
Cette situation se produit généralement lors de l'utilisation de classes de modèles. Nous définissons une classe de modèles et y définissons certaines fonctions virtuelles, mais le compilateur signale une erreur. En effet, lorsque nous déclarons et définissons une classe, ses fonctions membres semblent au compilateur être déterminées lors de la création de son instance. La table des fonctions virtuelles est générée au moment de la compilation. Par conséquent, les fonctions virtuelles ne peuvent pas être définies en tant que fonctions membres de modèles de classe.
Alors, comment devrions-nous gérer ce problème ?
Tout d'abord, nous devons comprendre le concept de fonctions virtuelles. Une fonction virtuelle est une fonction membre déclarée à l'aide du mot-clé virtual dans la classe parent. Elle peut être surchargée dans la sous-classe et réaliser un polymorphisme. En C++, les fonctions virtuelles sont implémentées via des tables de fonctions virtuelles. Par conséquent, les fonctions membres du modèle de classe ne peuvent pas être virtuelles car lorsque le modèle est instancié, le compilateur ne sait pas quelles fonctions le code utilisera finalement.
Il existe deux solutions à ce problème :
Méthode 1 : utiliser l'héritage et la séparation des modèles
Grâce à l'héritage de classe, vous pouvez transférer les fonctions membres vers la classe de base, puis utiliser les membres de la classe dérivée lors de l'instanciation du modèle. remplacer l’implémentation du membre de la classe de base. Cela évite d'utiliser des fonctions virtuelles dans les classes de modèles.
Par exemple :
template<typename T> class Base { public: void Foo() {static_cast<T*>(this)->Foo();} // 调用派生类的成员 }; class Derived : public Base<Derived> { public: void Foo() {std::cout << "Hello, World!" << std::endl;} };
La classe de base ici n'a que la fonction non virtuelle Foo(), et la fonction Foo() est réécrite en Derived. Lorsque nous utilisons la classe Base, nous transférons en fait la référence d'objet à sa classe dérivée.
Méthode 2 : Utiliser des pointeurs de fonction
Nous pouvons utiliser une classe ou une fonction non-modèle pour appeler une fonction virtuelle, puis transmettre la fonction en tant que paramètre à la fonction modèle.
Par exemple :
class MyClass { public: virtual void Foo() {std::cout << "MyClass::Foo()" << std::endl;} }; template<typename T> void Func(void (T::*foo)()) { T obj; (obj.*foo)(); } int main() { Func(&MyClass::Foo); // 调用 MyClass::Foo() return 0; }
Dans cet exemple, le modèle de fonction Func est utilisé pour résoudre le problème selon lequel les fonctions membres du modèle de classe ne peuvent pas être des fonctions virtuelles. Lors de l'appel de Func(), nous transmettons un pointeur de fonction membre de classe en tant que paramètre à la fonction Func(), et ce pointeur de fonction membre pointe vers une fonction virtuelle dans la classe MyClass.
Pour résumer, en C++, les fonctions membres du modèle de classe ne peuvent pas être des fonctions virtuelles car la table des fonctions virtuelles est générée au moment de la compilation et les fonctions membres de la classe modèle ne sont pas instanciées au moment de la compilation, le compilateur ne peut donc pas générer de fonctions virtuelles. tableau des fonctions. Afin de résoudre ce problème, nous pouvons utiliser les deux méthodes ci-dessus pour éviter d'utiliser les fonctions membres du modèle de classe comme fonctions virtuelles pour implémenter notre logique de code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!