struct level0
{
virtual void foo() = 0;
};
struct level1 : level0
{
virtual void foo() { cout <<" level1 " << endl; }
};
struct level2 : level1
{
virtual void foo() { cout <<" level2 " << endl; }
};
struct level3 : level2
{
using level1::foo;
};
int main()
{
level1* l1 = new level3;
l1->foo();
level3 l3;
l3.foo();
return 0;
}
il codice di cui sopra utilizzando gcc restituisceUna dichiarazione di utilizzo dovrebbe nascondere una funzione virtuale ereditata?
level2
level1
ma in ICC dà
level2
level2
Qual è corretto o è undefined dalla norma?
Edit: Questo dimostra c'è un bug di sicuro, si consideri la seguente funzione principale
int main()
{
level3 l3;
l3.foo(); // This prints level1
level3* pl3 = &l3;
pl3->foo(); // This prints level2
level3& rl3 = l3;
rl3.foo(); // This prints level1
level3& rpl3 = *pl3;
rpl3.foo(); // This prints level2
return 0;
}
Così lo stesso oggetto quando viene utilizzato direttamente produce risultati diversi e quando viene utilizzato tramite un puntatore di stesso tipo produce risultati diversi !!!
Direi che GCC è corretto, ma non ne sono sicuro. –
Divertente, stavo solo esaminando questo ieri. – aschepler
Ho confermato il comportamento con TDM MinGW g ++ 4.4.1. È un bug g ++, per favore segnalalo. Cheers & hth., –