Come viene chiamata la funzione non virtuale della classe base quando l'oggetto classe derivato viene assegnato alla classe base?

4
#include <iostream>

class Base {

private:
    int b_value;
public:
    void my_func() {std::cout << "This is Base's non-virutal my_func()" << std::endl; }

    virtual void my_Vfunc() {std::cout << "This is Base's virutal my_Vfunc()" << std::endl;}
};

  //----------------------------//


class Derived: public Base {

private:
    int d_value;
public:
    void my_func() {std::cout << "This is Derived's non-virtual my_func()" << std::endl; }

    virtual void my_Vfunc() {std::cout << "This is Derived's virtual my_Vfunc()" << std::endl;}
};


int main(){

Base * base = new Derived;
base->my_func();
base->my_Vfunc();

return 0; 
}

Stavo cercando di capire l'interno delle funzioni virtuali. Finora ho capito che il upcasting della classe derivata alla classe base chiama ancora la funzione virtuale quando facciamo base- > my_Vfunc () a causa di Derived :: vfptr.

La mia domanda è come viene chiamato my_func () di base qui? La mia confusione principale è come fa (durante l'upcasting) l'oggetto classe derivato fornisce informazioni sulla funzione non virtuale della classe base poiché ha solo informazioni di base come Base :: b_valore.

    
posta solti 03.02.2016 - 09:21
fonte

1 risposta

4

Le funzioni non virtuali sono chiamate in base al tipo che vede il compilatore. Se si dispone di una variabile Base *, la chiamata alle funzioni non virtuali chiamerà le funzioni Base. Questa è la differenza tra virtuale e non virtuale; chiamare una funzione virtuale chiama sempre la funzione appropriata per l'oggetto.

E non stai assegnando un oggetto. Stai assegnando un puntatore a un oggetto. Se hai assegnato un oggetto (per il quale dovresti implementare un operatore di assegnazione), allora sia virtuale che non virtuale chiamerebbero la funzione Base, perché l'oggetto sarebbe un oggetto Base.

    
risposta data 03.02.2016 - 09:50
fonte

Leggi altre domande sui tag