Maison >développement back-end >C++ >Les fonctions virtuelles en ligne sont-elles un mythe ou simplement mal comprises ?

Les fonctions virtuelles en ligne sont-elles un mythe ou simplement mal comprises ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-27 06:39:14172parcourir

Are Inline Virtual Functions a Myth, or Just Misunderstood?

Les fonctions virtuelles en ligne sont-elles vraiment un mythe ?

Dans une revue de code, le commentaire « les fonctions virtuelles n'ont pas besoin d'être en ligne » soulève des questions sur l'utilisation de fonctions virtuelles en ligne. Malgré leurs avantages potentiels, des doutes surgissent quant à leur caractère pratique.

Dans les scénarios où les fonctions sont appelées directement sur des objets, les fonctions virtuelles en ligne peuvent sembler appropriées. Cependant, on peut se demander pourquoi des fonctions virtuelles seraient utilisées si des objets sont utilisés pour les appels de méthode.

L'extrait de code ci-dessous illustre le problème :

class Temp {
public:
    virtual ~Temp() {}
    virtual void myVirtualFunction() const { cout << "Temp::myVirtualFunction" << endl; }
};

class TempDerived : public Temp {
public:
    void myVirtualFunction() const { cout << "TempDerived::myVirtualFunction" << endl; }
};

int main() {
    TempDerived aDerivedObj;
    // Compiler expands virtual functions
    aDerivedObj.myVirtualFunction();

    // Object type for Temp* is known
    Temp* pTemp = &aDerivedObj;
    pTemp->myVirtualFunction();

    return 0;
}

Alors que le compilateur peut intégrer la fonction virtuelle appeler lorsque la classe exacte de l'objet est connue (par exemple, aDerivedObj), il ne peut pas le faire lorsque l'objet est accédé via un pointeur (pTemp).

Cette limitation soulève la question : faut-il éviter les fonctions virtuelles en ligne puisque leur expansion est souvent restreinte ?

La réponse :

Les fonctions virtuelles peuvent être intégrées dans certaines circonstances, comme décrit dans la FAQ C :

"La seule fois où un appel virtuel en ligne peut être intégré, c'est lorsque le compilateur connaît la « classe exacte » de l'objet qui est la cible de l'appel de fonction virtuelle. Cela ne peut se produire que lorsque le compilateur a un objet réel plutôt qu'un pointeur ou une référence à un objet.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn