PDA

Visualizza la versione completa : [C++] Polimorfismo


Pacio88
28-12-2008, 18:17
Ho questo codice che una volta compilato ed eseguito mi da un output "inaspettato".


#include <iostream>
using namespace std;

class A {
protected:
int i;
public:
A(){ i = 0; cout << "A" << endl;}
void virtual f() = 0;
void stampa(){ cout << "A " << i << endl;}
};

class B: public A {
int j;
public:
B(){ j = 1; cout << "B" << endl;}
void f() { cout << j << ' ' << i << endl;}
void stampa(){ cout << "B " << j << endl;}
};

int main()
{
B* b = new B;
cout << "Prova:" << endl;
b->f();
b->stampa();
return 0;
}
L'output di questo programma il seguente:

[Session started at 2008-12-28 18:13:01 +0100.]
A
B
Prova:
1 0
B 1

The Debugger has exited with status 0.
Mentre io mi sarei aspettato il seguente:

[Session started at 2008-12-28 18:13:01 +0100.]
A
B
Prova:
1 0
A 0

The Debugger has exited with status 0.
Secondo me non essendo definita virtual la funzione stampa nella classe A, dovrebbe essere chiamata quando viene letto l'istruzione b->stampa(). Comunque sicuramente devo avere qualche idea confusa sul polimorfismo pertanto aspetto chiarimenti, grazie come sempre per l'aiuto.

shodan
28-12-2008, 19:00
L'output corretto. Se non dichiari la funzione virtual, il compilatore semplicemente la esclude dalla vtable di funzioni della classe base che deve richiamare a runtime. Nel tuo caso, le due funzioni stampa di A e B sono a tutti gli effetti due funzioni distinte che il programma richiama senza preoccuparsi di leggere la vtable della classe base.

sotoli
28-12-2008, 19:03
Ciao....per avere il risultato che ti aspetti il puntatore b deve essere di tipo A*, in questo modo poi facendo puntare b ad un oggetto della classe B (classe derivata di A), accedi alle funzioni virtuali della classe B e a quelle non virtuali della classe A (classe base).

MacApp
29-12-2008, 01:27
Giusto per chiarezza, avresti il tuo ouput con:


int main()
{
A* b = new B;
cout << "Prova:" << endl;
b->f();
b->stampa();
return 0;
}

Loading