2010-06-04 6 views
4

J'ai le code suivant qui est semble conduire à la boucle infinie:Pourquoi ce programme se bloque-t-il?

struct X 
{ 
    void my_func(int) { std::cout << "Converted to int" << std::endl; } 
}; 

struct X2 : X 
{ 
    void my_func(char value) { my_func(value); } 
}; 

Quel est le problème avec elle?

+3

Il n'y a pas de programme ici, juste deux définitions de classe. Il ne peut pas et ne peut pas accrocher. En fait, il ne peut pas être exécuté. Publiez le code réel que vous essayez d'exécuter. – AnT

+1

La plupart d'entre nous ont été en mesure de remplir les blancs. Dites juste ... –

+0

@Igor Zevaka: Certainement. Mais dans 9 cas sur 10, "remplir les blancs" produit une réponse inutile à une question insignifiante. J'espère que celui-ci se révèle être 1 sur 10 quand ça marche. – AnT

Répondre

10

Le second bit est infiniment récursive:

struct X2 : X 
{ 
    void my_func(char value) { my_func(value); } //calls itself over and over again 
}; 

Prefix my_func avec le nom de la classe de base et vous serez OK

struct X2 : X 
{ 
    void my_func(char value) { X::my_func(value); } 
}; 

EDIT juste réalisé que la classe de base my_func ' s signature est différente. Le compilateur C++ résout statiquement la surcharge de la fonction, c'est-à-dire qu'il choisit la fonction qui correspond le mieux au type de l'argument, c'est pourquoi il appelle la surcharge char.

Par exemple:

char cChar = 'a'; 

myfunc(cChar); 

void myfunc(char a){} //<-- this one is called 
void myfunc(int a){} 

int iInt = 1; 

myfunc(iInt); 

void myfunc(char a){} 
void myfunc(int a){} //<-- this one is called 

Merci Charles Bailey. Le code ci-dessus ne s'applique pas dans ce cas car X2my_func cache la classe de base my_func. Cela laisse la seule solution pour qualifier la fonction avec le nom de la classe.

+0

Merci. Je pensais que 'my_func' n'était pas encore défini et que 'X :: my_func' devrait être appelé. –

+0

@zilgo: Ce n'est pas défini, mais il est déclaré. Et c'est tout ce dont vous avez besoin. – GManNickG

+1

Dans une classe dérivée, toute fonction portant le même nom mais une signature différente masquera les fonctions de classe de base du même nom. Cela signifie que dans les fonctions membres de 'X2' non qualifié' my_func' _always_ fait référence à 'X2 :: my_func' et jamais à' X :: my_func'. Il n'y a pas de "meilleur match" ici. Le message "Par exemple:" est trompeur car il ne s'applique tout simplement pas dans ce cas. –

2
void my_func(char value) { my_func(value); } 

Vous passer le value qui est char il résout à appeler la même méthode accepte un paramètre char. Cela devient une boucle sans fin.

2
void my_func(char value) { my_func(value); } 

juste là, vous avez écrit une fonction récursive sans cas de base. Je ne sais pas trop sur C++, mais vous devez spécifier une certaine façon que vous voulez appeler la my_func de X, et non X2 de (je suppose que ce que vous voulez faire.)

modifier: Pour résoudre ce problème , vous devez jeter la valeur à un int

+2

Une conversion en 'int' du paramètre ne va pas aider. 'my_func' dans la classe dérivée cache la classe de base' my_func'. Une qualification explicite de 'my_func' est nécessaire. –

+0

Ne le surcharge-t-il pas, ne le cache-t-il pas? – Bwmat

0

Le programme obtient dans une boucle infinie. my_func() s'appelle lui-même et il n'y a pas de condition pour en sortir.

0

Votre appel my_func (valeur) est récursif. Voulez-vous dire super :: my_func (value)?

0

Vous devez appeler explicitement la classe de base fonction, à savoir:

struct X 
{ 
    void my_func(int) { std::cout << "Converted to int" << std::endl; } 
}; 

struct X2 : X 
{ 
    void my_func(char value) { X:my_func(value); } 
}; 

Par défaut, le compilateur utilise des fonctions au sein de la même classe si elle est présente, car il n'y a aucun moyen pour elle de savoir lequel vous voulez vraiment utiliser. En spécifiant BaseClass::Function dans une méthode de classe dérivée, le compilateur créera explicitement un appel à la méthode de cette classe de base, même si vous avez remplacé.

Questions connexes