2012-12-27 3 views
12

Diciamo Ho le seguenti classi:Chiamare un metodo sovrascritto dalla classe base

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

protected: 
    virtual void bar() { 
    // Do stuff 
    } 
} 

class B : public A { 
protected: 
    virtual void bar() { 
    // Do other stuff 
    } 
} 

Se ho un 'istanza di B e chiamare il metodo foo, quale metodo bar sarebbe ottenere chiamato? E questo compilatore è specifico?

Grazie

risposta

15

Il A::foo chiameranno B::bar se avete un'istanza di B. Non importa se l'istanza è referenziata tramite un puntatore o un riferimento a una classe base: indipendentemente da ciò, viene chiamata la versione di B; questo è ciò che rende possibili le chiamate polimorfe. Il comportamento non è specifico del compilatore: le funzioni virtuali si comportano in questo modo in base allo standard.

+7

Si noti che questo comportamento non è il caso all'interno del costruttore e del distruttore di base. Lì chiamerà l'implementazione di base. Discussione: http://www.cplusplus.com/forum/general/109477/ –