Virtual pointer e polimorfismo

di il
2 risposte

Virtual pointer e polimorfismo

Buongiorno,

come funzioni il polimorfismo mi è chiaro, ma non altrettanto il meccanismo che permette tale funzionamento. Se ho due classi B e D, dove D deriva da B che è la classe base, e in B la funzione fun() dichiarata virtual e faccio:

B* pb;
pb = new D;
pb -> fun();

naturalmente verrà chiamata fun() di D, perché il VPTR essendo un attributo appartiene all'oggetto, e l'oggetto istanziato è di tipo D, quindi il VPTR è valorizzato con l'indirizzo della VTABLE di D. La cosa che non mi è chiara però è la seguente:
quando viene chiamato il costruttore di D, questo chiamerà a sua volta (prima che ne venga eseguito il corpo) il costruttore di B. Quindi dovrebbe creare due VPTR, prima quello che indirizza la VTABLE di B e dopo quello che indirizza la VTABLE di D. Ho pensato che in questi casi l'ultimo VPTR creato sovrascriva l'altro, ma è una deduzione mia in mancanza di informazioni.

Grazie

2 Risposte

  • Re: Virtual pointer e polimorfismo

    Prova questo:
    
    #include <iostream>
    
    using namespace std;
    
    struct B
    {
        B(){
            fun();
        }
    
        virtual void fun() {
            cout << "I am B" << endl;
        }
    };
    
    
    struct D : public B
    {
        D() { }
    
        virtual void fun() {
            cout << "I am D" << endl;
        }
    };
    
    
    int main() {
        cout << "Hello, World!" << endl;
    
        B *p = new D;
        p->fun();
    
        return 0;
    }
    
    Quindi, in prima approssimazione, e' esatto.
  • Re: Virtual pointer e polimorfismo

    Grazie, ho provato il codice da te postato con una piccola modifica: ho messo una chiamata a fun() pure nel costruttore di D, ma viene ignorata, e non capisco perché.
Devi accedere o registrarti per scrivere nel forum
2 risposte