1
votes

Puis-je remplacer une fonction non virtuelle en C ++

Je veux savoir puis-je remplacer une fonction non virtuelle en C ++ parce que j'ai trouvé ce problème en jouant avec C ++ override keyword J'ai le code comme suit

class A
{
public:
    void say()
    {
        cout << "From A\n";
    }
};
class B : public A {
public:
    void say()
        override
    {
        cout << "From B\n";
    }
};

mais lorsque j'exécute le code, visual studio affiche l'erreur suivante
'B :: say': la méthode avec le spécificateur de remplacement 'override' n'a remplacé aucune méthode de classe de base mais quand j'ai utilisé un mot-clé virtuel dans la classe A, l'erreur a disparu et le code fonctionne parfaitement


2 commentaires

Que vous ne pouvez pas le faire est un indicateur assez fort que vous ne pouvez pas, n'est-ce pas ?. Vous pouvez choisir quelque chose dans la liste des livres .


Vous êtes tombé sur l'une des implications les plus pratiques de la différence entre les membres de la classe virtuels et non virtuels . Êtes-vous par hasard plus familier avec Java? Dans ce dernier, toutes les méthodes sont virtuelles par défaut.


3 Réponses :


0
votes

Non, vous ne pouvez pas. "Dans une déclaration ou une définition de fonction membre, le remplacement garantit que la fonction est virtuelle et remplace une fonction virtuelle d'une classe de base. Le programme est mal formé (une erreur de compilation est générée) si ce n'est pas vrai." < / p>

Voir également la réponse ici


1 commentaires

Merci pour votre réponse. Je viens de me perdre en regardant les réponses sur divers sites Web comme programiz et javatpoint et bien d'autres. Je ne comprends pas comment ils peuvent dire que les exemples qu'ils ont fournis sont des exemples de remplacement, alors je viens de mettre le mot-clé override parce que je sais que cela va dire que ce n'est pas le cas, car il est développé pour détecter la météo, la fonction est en cours écrasé ou pas



1
votes

Vous ne remplacez pas say dans B

du spécificateur de remplacement C ++ :

Dans une déclaration ou une définition de fonction membre, le remplacement garantit que la fonction est virtuelle et remplace une fonction virtuelle d'une classe de base. Le programme est mal formé (une erreur de compilation est générée) si ce n'est pas vrai.

Regardez cet exemple:

pi@raspberrypi:/tmp $ g++ c.cc
pi@raspberrypi:/tmp $ ./a.out
From A
From B
From A
pi@raspberrypi:/tmp $ 

Compilation et exécution:

#include <iostream>

class A
{
  public:
    void say()
    {
        std::cout << "From A\n";
    }
};

class B : public A {
  public:
    void say()
        //override
    {
        std::cout << "From B\n";
    }
};

int main()
{
  A a;
  B b;
  
  a.say();
  b.say();
  ((A &) b).say();
}

Mettre dire virtuel dans A (donc implicitement dans B) ((A &) b) .say (); imprime From B car cette heure-là est en train de se substituer


0 commentaires

0
votes

override ne signifie pas que la fonction que vous marquez remplacera comme par magie la fonction de base. Son but est de dire au compilateur "Veuillez vérifier que je remplace réellement une fonction virtuelle de classe de base ici et donnez-moi une belle erreur de compilateur si j'ai raté, au lieu de faire quelque chose que je n'avais pas l'intention de faire".

Si la fonction de classe de base est virtuelle , vous n'avez pas besoin de dire override , mais vous pouvez le faire pour vous aider à gagner moins erreurs.

Si la fonction de classe de base n'est pas virtuelle , vous ne pouvez pas la remplacer, remplacer le mot-clé ou non.


1 commentaires

Merci pour votre réponse. Je viens de me perdre en regardant les réponses sur divers sites Web comme programiz et javatpoint et bien d'autres. Je ne comprends pas comment ils peuvent dire que les exemples qu'ils ont fournis sont des exemples de remplacement, alors je viens de mettre le mot-clé override parce que je sais que cela va dire que ce n'est pas le cas, car il est développé pour détecter la météo, la fonction est en cours écrasé ou pas