Ciao a tutti, il codice in sč non č difficile da capire..
codice:
template<class X>
X& fun(X& ref) { return ref; };

main() {
  B b;
  fun<A>(b); // 1
  B* p = new D(); // 2
  C c;
  try{
    dynamic_cast<B&>(fun<A>(c)); // 3
    cout << "topolino";
  }
  catch(bad_cast) { cout << "pippo "; }
  if( !(dynamic_cast<D*>(new B())) ) cout << "pluto "; // 4
}
Si suppone che A,B,C,D siano classi polimorfe distinte, ed il main stampi in output "pippo pluto".
In pratica si deve indicare, per ognuna delle relazioni X<=Y (X č sottotipo di Y), se č vera, falsa o nč vera e nč falsa (cioč č possibile che X<=Y).

Si ottiene facilmente che:
B<=A vero (1)
D<=B vero (2)
C<=A vero (3)
C<=B falso (3)
B<=D falso (4)

Ora, non capisco come si possa dire che una relazione non sia nč vera nč falsa. Ad esempio, si ha che B<=A: "B sottotipo di A" č vera, il che significa che
1) il tipo B č uguale al tipo A
oppure
2) B č un sottotipo diretto o indiretto di A.
Considerando perņ che A e B sono classi distinte, vale solamente la 2) e quindi se B<=A č vera: si puņ dire con certezza che la relazione A<=B č falsa ?