2013-01-08 17 views
27

Questa è probabilmente una domanda noob, mi dispiace per quello. Recentemente ho affrontato un problema strano quando ho provato a gettare un po 'di roba di alto livello in C++, sovraccarico di funzioni ed ereditarietà.problema C++ con sovraccarico di funzione in una classe ereditaria

Mostrerò un semplice esempio, solo per dimostrare il problema;

Esistono due classi, classA e classB, come di seguito;

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
}; 

Secondo quello che so classB dovrebbero ora possedere due func(..) funzioni, sovraccariche a causa di diversi argomenti.

Ma quando si prova questo nel metodo principale;

int main(){ 
    int a; 
    char b[20]; 
    classB objB; 
    objB.func(a); //this one is fine 
    objB.func(b); //here's the problem! 
    return 0; 
} 

Dà errori come il metodo void func(char[]){}; che è nella classe super, classA, non è visibile int la classe derivata, classB.

Come posso superare questo? non è così che funziona il sovraccarico in C++? Sono nuovo di C++ ma in Java, so che posso fare uso di qualcosa di simile.

Anche se ho già trovato this thread che chiede informazioni simili, penso che i due casi siano diversi.

risposta

40

Tutto ciò che serve è un using:

class classB:public classA{ 
    public: 
     using classA::func; 
     void func(int){}; 
}; 

non cerca la classe base per func perché già trovato uno nella classe derivata. L'istruzione using porta l'altro sovraccarico nello stesso ambito in modo che possa partecipare alla risoluzione di sovraccarico.

9

E 'ben spiegato per esempio nelle risposte di questa domanda:

Why should I use the "using" keyword to access my base class method?

Insomma, compilatore interrompe la ricerca per la corrispondenza metodi dalle classi genitore, quando trova corrispondenza nome del metodo nella classe corrente, anche quando quel metodo non è compatibile. Immagino che questo consenta ad alcune conversioni di tipo automatico di funzionare in modo più logico, senza la necessità di sovrascrivere così tanti metodi della classe genitore.

+1

Grazie per la risposta + link. Mi chiedo se le persone C++ abbiano mantenuto questa cosa intenzionalmente. ci sono dei professionisti? mi sembra che rovini l'idea dell'eredità, non è vero? – Anubis

+0

@Anubis, È solo una questione di regole per la risoluzione del sovraccarico e lo scopo della dichiarazione 'using' in generale. – chris

3

Se si esegue l'override di una variante di una funzione nella classe derivata, è necessario eseguire l'override di tutte le varianti. È possibile utilizzare ciò che JLledo ha suggerito o scrivere la variante della funzione nella classe derivata che chiama semplicemente la funzione della stessa classe della classe base.

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
     void func(char[]){}; 
}; 

void classB:func(char[] ch) 
{ 
    classA::func(ch); 
} 
-4

È necessario passare l'argomento di tipo int in

objB.func(b); //here's the problem! 

BCS è stato sovraccaricato di int argomento

+0

Puoi provare a fornire una risposta più dettagliata. – easwee

Problemi correlati