2013-06-26 15 views
6

Quello che voglio fare è che Execute() venga eseguito e completato, chiama lo Base::Done() quindi chiama lo Derived::Done(). Lo sto facendo perché la classe BaseExecute farà qualcosa e una volta eseguita chiama lo Derived::Done(). Spero di spiegarlo correttamente. Un po 'come un ascoltatore che viene chiamato quando un compito è completato. Sono piuttosto bloccato su come la classe Base chiamerà la classe Derived.C++ come chiamare il metodo nella classe derivata dalla classe base

class Base 
{ 
    virtual void Done(int code){}; 
    void Execute(); 
} 

void Base::Execute() 
{ 
} 


class Derived : Base 
{ 
    void Done(int code); 
    void Run(); 
} 

Derived::Done(int code) 
{ 
} 

void Derived::Run() 
{ 
    Execute(); 
} 
+3

Anche se questo può essere fatto, probabilmente stai cercando il modello Template Method (google). –

risposta

8

È possibile utilizzare un metodo di modello:

class Base 
{ 
public: 
    void Execute() 
    { 
    BaseDone(42); 
    DoDone(42); 
    } 
private: 
    void BaseDone(int code){}; 
    virtual void DoDone(int) = 0; 
}; 

class Derived : Base 
{ 
public: 
    void Run() { Execute(); } 
private: 
    void DoDone(int code) { .... } 
}; 

Qui, Base controlla come propri e derivati ​​metodi sono utilizzati in Execute(), ei tipi derivati ​​devono solo implementare una componente di che l'attuazione via un metodo virtuale privato DoDone().

metodo di classe
+0

Grazie per l'informazione. Ho una migliore comprensione di questo ora – adviner

3

La base può chiamare il metodo derivato molto semplicemente:

void Base::Execute() 
{ 
    Done(42); 
} 

Per avere la classe di base Fatto() chiamato prima della classe derivata, è possibile chiamare come la prima istruzione nella classe derivata metodo, o utilizzare l'idioma non virtuale.

Ecco un esempio di chiamata nella parte superiore del metodo di classe derivata. Questo si basa sulla classe derivata per farlo bene.

void Derived::Done(int code) 
{ 
    Base::Done(code); 
} 

Ecco un esempio di utilizzo del linguaggio non virtuale:

class Base 
{ 
    void Done(int code){ 
     // Do whatever 
     DoneImpl(); // Do derived work. 
    } 
    virtual void DoneImpl() { }; 
    ... 
}; 

class Derived { 
    virtual void DoneImpl() { 
     // Do derived class work. 
    }; 
    ... 
}; 
+0

Ho provato questo esempio, ma continuo a ricevere un errore nessuna funzione corrispondente per la chiamata a Base :: DoneImpl() – adviner

+0

Per quale parte dell'esempio sopra hai un errore? [Ecco la fonte di lavoro per la prima opzione: http://ideone.com/8Iw6Hl.] –

Problemi correlati