2012-08-29 13 views
8

ho:C++: Come chiamare una funzione classe genitore dall'esterno

class A{ 
    public: 
     virtual void foo(); 
}; 

class B : public A{ 
    public: 
     void foo(); 
}; 

B *ptr = new B(); 

voglio chiamare Una di foo() direttamente utilizzando il puntatore 'ptr'.

Quando provo

(A*)ptr->foo(); 

si chiama ancora la versione di B di foo(). Come si chiama invece la versione di A?

È possibile? Quali sono le alternative? Grazie.

+0

Dai un'occhiata a http://en.wikipedia.org/wiki/Scope_resolution_operator – Pramod

+0

Puoi chiarire cosa intendi con "non ha funzionato"? Cosa succede esattamente quando provi il codice sopra? –

+3

In questo modo si vanifica completamente lo scopo di rendere una funzione virtuale, quindi significa che l'utente della classe 'A' sta eludendo l'intento del progettista della classe. Questo probabilmente significa che c'è un errore di progettazione da qualche parte: o 'A' non fornisce tutte le funzionalità necessarie, o l'utente di' A' non capisce cosa si suppone che 'A' faccia. –

risposta

18

Quando si nomina una funzione con il modulo di risoluzione dell'ambito ::, si chiama la funzione denominata, come se non fosse virtuale.

ptr->A::foo(); 
+3

+1. Questo è corretto, anche se sarebbe meglio parlare anche del problema dell'accessibilità nel codice dell'OP. – Nawaz

+3

@Nawaz: E ancora meglio se si menziona anche il fatto che ciò infrange tutti i principi di OO :) L'utente di 'B' non dovrebbe preoccuparsi di quale versione di' foo' è chiamata, che è il punto principale del polimorfismo. –

2

È necessario rendere pubbliche le proprie funzioni. A tale scopo, semplicemente facendo la seguente modifica:

class A{ 
    public: 
     virtual void foo(); 
}; 

class B : public A{ 
    public: 
     void foo(); 
}; 

Quando non si esegue questa operazione, le funzioni sono automaticamente privata e inaccessibile da "fuori".

+0

Sono pubblici, non l'ho specificato nell'esempio. – nahpr

+4

@nahpr Per riferimento futuro, ti suggerisco di fare uno sforzo coscienzioso per non introdurre ulteriori errori nel codice che pubblichi qui. Ciò contribuirà ad evitare di sprecare il tuo tempo a selezionare risposte inutili. –

Problemi correlati