Ho questo codice che una volta compilato ed eseguito mi da un output "inaspettato".

codice:
#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:
codice:
[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:
codice:
[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.