P *p = Create();
if(p is an instance of A)
((A *)p)->ab();
else if(p is an instance of B)
((B *)p)->ab();
else if(p is an instance of C)
((C *)p)->cd();
else if(p is an instance of D)
((D *)p)->cd();
UCAqcCA9IENyZWF0ZSgpOwoKaWYocCBpcyBhbiBpbnN0YW5jZSBvZiBBKQogICAgKChBICopcCktPmFiKCk7CmVsc2UgaWYocCBpcyBhbiBpbnN0YW5jZSBvZiBCKQogICAgKChCICopcCktPmFiKCk7CmVsc2UgaWYocCBpcyBhbiBpbnN0YW5jZSBvZiBDKQogICAgKChDICopcCktPmNkKCk7CmVsc2UgaWYocCBpcyBhbiBpbnN0YW5jZSBvZiBEKQogICAgKChEICopcCktPmNkKCk7