2010-05-07 9 views
8
class Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Base"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Derived"; 
    } 
}; 

Derived d; // call Base::foo on this object 

Provato da casting e puntatori di funzione ma non ho potuto farlo. È possibile sconfiggere il meccanismo virtuale (chiedendosi solo se è possibile)?Chiama il metodo virtuale dalla classe base su un oggetto di tipo derivato

+0

possibile duplicato di [Come chiamare il metodo della classe Base tramite il puntatore della classe base che punta alla classe derivata] (http://stackoverflow.com/questions/1136249/how-to-call-base-class-method-through-base -class-pointer-pointing-to-derived-cla) – outis

risposta

24

Per chiamare esplicitamente la funzione foo() definita in Base, utilizzare:

d.Base::foo(); 
+0

+1 anche per te Daniel - strano come la tua risposta non si è presentata all'inizio per me. – ChrisBD

+1

@ChrisBD: Dopo averlo postato, mi sono improvvisamente reso conto che non potevo ricordare di aver mai usato direttamente questo costrutto (solo all'interno della definizione della funzione nella classe derivata). Quindi, ho deciso di cancellarlo per un po ', fino a quando non ero sicuro che funzionasse. –

6
d.Base::foo(); 

Nota che definirebbero Derived::foo indipendentemente dal fatto che foo era virtuale o no.

+0

+1 @Marcelo - sei troppo veloce per me :) – ChrisBD

+1

Er ... In realtà un nome completamente qualificato sconfigge * dispath virtuale * in particolare. Sembra che tu stia dando per scontato che la chiamata 'd.foo()' non sia virtuale. Il linguaggio non dice niente del genere. La chiamata 'd.foo()' è * virtual * dal punto di vista della lingua, cioè è risolta secondo il tipo dinamico di 'd'. Se il compilatore lo invia staticamente, non è altro che un'ottimizzazione fatta dal compilatore (perché il tipo dinamico è noto al momento della compilazione). Dal punto di vista della lingua, l'unico modo per sconfiggere la distribuzione virtuale consiste nell'utilizzare un nome completo. – AnT

+0

Beh, sconfigge entrambi. Ma 'b-> Base :: foo' * solo * sconfigge l'invio virtuale. –

Problemi correlati