la surcharge de méthode de classe de base dans la classe dérivée
Je suis en train d'essayer de comprendre pourquoi le code suivant ne compile pas, apparemment, la solution s'appuie en particulier de déclarer la dépendance sur method_A dans la classe dérivée.
Veuillez consulter le code suivant:
class Base
{
public:
void method_A(int param, int param2)
{
std::cout << "Base call A" << std::endl;
}
};
//does not compile
class Derived : public Base
{
public:
void method_A(int param)
{
std::cout << "Derived call A" << std::endl;
}
};
//compiles
class Derived2 : public Base
{
public:
using Base::method_A; //compile
void method_A(int param)
{
std::cout << "Derived call A" << std::endl;
}
};
int main ()
{
Derived myDerived;
myDerived.method_A(1);
myDerived.method_A(1,2);
Derived2 myDerived2;
myDerived2.method_A(1);
myDerived2.method_A(1,2);
return 0;
}
"test.cpp", (S) Le mauvais nombre d'arguments ont été spécifiés pour "Dérivée::method_A(int)".
Qu'est-ce que la raison technique qui empêche la classe dérivée de connaître sa classe de base est la mise en œuvre de la méthode c'est d'essayer de surcharge?
Je suis à la recherche pour mieux comprendre comment le compilateur/linker se comporte dans ce cas.
- Êtes-vous manque
virtual
? - non, mon intention est de surcharge de la fonction. S I l'on n'a pas d'objet de l'héritage, il serait comme: void method_A(int param int param2); void method_A(int param);
Vous devez vous connecter pour publier un commentaire.
Son appelé Nom de la Clandestinité. Lorsque vous définissez un non virtuel méthode avec le même nom que la Base de la méthode qu'il masque la méthode de classe de Base dans la classe Dérivée de sorte que vous obtenez l'erreur pour
Pour éviter cache de la Base de les méthodes de la classe dans la classe Dérivée d'utilisation à l'aide de mots clés que vous avez fait dans Derived2 classe.
Aussi, si vous voulez faire le travail que vous pouvez le faire explicitement
Découvrez cette pour mieux expliquer pourquoi le nom de masquage est entré en image.
Bien, pour une vous appelez
avec 2 arguments, alors que la fois dans la base et dérivées de la méthode est déclarée, pour ne prendre qu'un seul argument.
Secodnly, vous n'êtes pas primordial quoi que ce soit, parce que method_A n'est pas virtuel. Vous êtes à la surcharge.
Si votre intention est de remplacer vide
Base::method_A(int param, int param2)
alors vous devez marquer virtuelle dans la classe de base:Toute la fonction de substitution de ce doivent avoir les mêmes paramètres et presque le même type de retour ("près de" lâche ce qui signifie que les différents types de retour doit être polymorphically liés, mais dans la plupart des cas, il devrait avoir la même type de retour).
Tout ce que vous êtes en train de faire est surcharge la fonction dans la classe de base. Le
using
mot-clé est d'amener la classe de base de la fonction dans la classe enfant' espace de noms, comme la langue et le comportement n'est pas de le faire par défaut.