2013-03-21 18 views
6

ho questo codice:chiamata della classe base

#include <iostream> 
#include <string> 

using namespace std; 

class A { 
    public: void Print(int i) {cout<<i;} 
}; 

class B : public A { 
    public: void Print(string s) {cout<<s;} 
}; 

int main() { 
    B bInstance; 
    bInstance.Print(1); 
    return 0; 
} 

Questo mi dà un errore:

error: invalid conversion from 'int' to 'const char*' [-fpermissive] 

che significa che sta tentando di chiamare di B Stampa senza considerare il sovraccarico ereditato. Ma, A's Print dovrebbe essere richiamabile da un'istanza B. Infatti, se cambio la chiamata a

bInstance.A::Print(1); 

allora compila senza errori, ma volevo evitare di dover scrivere l'operatore nell'ambito di classe ogni volta. C'è un modo per dire al compilatore che sto cercando di chiamare il sovraccarico della funzione della classe base?

+2

La risoluzione del sovraccarico viene eseguita prima di cercare 'A' perché ha trovato qualcosa in' B'. Usa un'istruzione 'using' per inserire' A' e partecipa alla risoluzione di sovraccarico. – chris

+0

Se posso umilmente suggerire che l'utilità del sovraccarico è talvolta alquanto sopravvalutato. Prendi in considerazione l'uso di nomi distinti, come ad esempio 'void printInt (int i);' e 'void printString (string s);' – bobobobo

risposta

11

La funzione Print() membro nella sottoclasse pelli la funzione di membro Print() della superclasse. Pertanto, il compilatore non vedrà A::Print() e proverà a richiamare B::Print(), lamentandosi del fatto che uno int non può essere convertito in una stringa.

Per portare A::Print() nel set di sovraccarico, è possibile introdurre una dichiarazione using:

class A { 
public: 
    void Print(int i) {cout<<i;} 
}; 

class B : public A { 
public: 
    using A::Print; 
// ^^^^^^^^^^^^^^^ 
    void Print(string s) {cout<<s;} 
}; 

Ecco una live example del codice di lavoro dopo le modifiche necessarie.

+0

Aggiunta quella riga, ora viene visualizzato 'errore: void A :: Print (int) è inaccessibile'. – Mic

+1

@Mic, inseriscilo nella parte 'public:' di 'B'. Immagino che tu l'abbia aggiunto prima della riga public: void Print (string s) {cout << s;} ', che la renderebbe privata. – chris

+0

Non ho notato la parte "pubblica" dell'istruzione "using A :: Print", la tua risposta è stata chiara e accurata, grazie! – Mic

Problemi correlati