Pourquoi un substituée fonction dans la classe dérivée cacher d'autres surcharges de la classe de base?

Examiner le code :

#include <stdio.h>

class Base {
public: 
    virtual void gogo(int a){
        printf(" Base :: gogo (int) \n");
    };

    virtual void gogo(int* a){
        printf(" Base :: gogo (int*) \n");
    };
};

class Derived : public Base{
public:
    virtual void gogo(int* a){
        printf(" Derived :: gogo (int*) \n");
    };
};

int main(){
    Derived obj;
    obj.gogo(7);
}

Eu cette erreur :

>g++ -pedantic -Os test.cpp -o test 
test.cpp: In function `int main()': 
test.rpc:31: error: no matching function for call to `Dérivée::gogo(int)' 
test.rpc:21: remarque: les candidats sont: virtual void Dérivés::gogo(int*) 
test.rpc:33:2: attention: pas de saut de ligne en fin de fichier 
>le code de Sortie: 1 

Ici, la classe Dérivée de la fonction est éclipsant toutes les fonctions de même nom (pas de signature) dans la classe de base. En quelque sorte, ce comportement de C++ n'a pas l'air OK. Pas polymorphes.

  • Dupliquer: stackoverflow.com/questions/411103/...
  • brillant question, je n'ai découvert cela récemment trop
  • Je pense que Bjarne (à partir du lien Mac posté) celui qui a le mieux en une phrase: "En C++, il n'y a pas de surcharge dans les étendues de la classe dérivée étendues ne sont pas une exception à cette règle générale."
  • Que le lien est brisé. Voici le bon (comme maintenant) - stroustrup.com/bs_faq2.html#overloadderived
  • Si tu sûr, il ne veut pas nuire à quoi que ce soit sans cacher la classe de base gogo fonctions, vous pouvez éviter de le cacher en ajoutant using Base::gogo dans la classe Dérivée.
  • Aussi, je voulais souligner que obj.Base::gogo(7); fonctionne toujours par l'appel de la fonction cachée.