Originariamente inviato da Who am I
Non sono strettamente necessarie liste di ABase* perché il downcasting evita il problema dell' object splicing.
Sarà, ma a me questo codice:
codice:
struct Alfa {
	virtual ~Alfa() {}
	int a;
};

struct Beta : Alfa{
	~Beta() {}
	int b;
};

main ()

Beta b;
b.a = 7;
b.b = 9;

Alfa a = b;


Beta* c = static_cast<Beta*>(&a);
cout << c->a << "  --  " << c->b << endl;

Beta* d = (Beta*)&a;
cout << d->a << "  --  " << d->b << endl;

Beta* e = (Beta*)&a;
cout << e->a << "  --  " << e->b << endl;

Beta* f = reinterpret_cast<Beta*>(&a);
cout << f->a << "  --  " << f->b << endl;

Beta g = dynamic_cast<Beta&>(a);
/*
	Beta h = (Beta)a;
	Beta i = static_cast<Beta>(a);
	Beta j = reinterpret_cast<Beta>(a);
*/
da un object splicing tramite cast di puntatori, un'eccezione nel dynamic_cast e un errore di compilazione nella parte commentata.
Altri downcasting non ne conosco.