Sto usando il C++builder del Borland Dev.Studio 2006, ma penso che il problema sia indipendente dall'ambiente di sviluppo.
Premetto che, essendo io un programmatore "nato" col VB6, magari sto facendo una domanda "stupida", ma io non ci riesco....

Cosa ho (semplifico molto):

Una classe base, che deriva da una classe "standard" del C++builder
codice:
class cBase: public TObject { 
  private:
	char	cNome[0xFF];
	String	__fastcall GetNome() {return (String)cNome;};
	void	__fastcall SetNome(String sNome) {strncpy(cNome,sNome.c_str(),0xfE);cNome[0xff]=0;};
	int iIndice;
  public:
	String	__fastcall StringaDati(){return "";};
	__property String		Nome = {read=GetNome, write=SetNome};
	__property int		Indice = {read=iIndice, write=iIndice};
};
una decina di classi (cDerivata1, cDerivata2,...) derivate dalla cBase, che ridefiniscono il metodo "StringaDati", e una "Collection" (una lista) che, dato l'indice, restituisce un "TObject*".

Al momento, se voglio chiamare il metodo "StringaDati" per tutte le classi istanziate devo sapere che tipo di classe c'è al dato indice e castare il puntatore al tipo giusto:
supponiamo che le prime 10 siano cDerivata1, dalla 10 alla 20 siano cDerivata2 ecc...
codice:
for (j=0;j<100;j++) {
	if (j<10) {
		Dati = (cDerivata1*)Lista->Items[j]->StringaDati();
		continue;
	}
	if (j<20) {
		Dati = (cDerivata2*)Lista->Items[j]->StringaDati();
		continue;
	}
	....
}
La cosa è evidentemente orrenda.

Quello che mi serve è un modo per chiamare il metodo "StringaDati" fregandomene del Tipo di classe a cui sto puntando.
In pratica, qualcosa tipo:
codice:
for (j=0;j<100;j++) {
	Dati = (qualcosa*)Lista->Items[j]->StringaDati();
}
lasciando che sia qualcosa a sapere quale "versione" di StringaDati serve.

Non ho capito se 'sta cosa si fa con le "interfacce", e se sì come si fa....
....qualcuno mi da una mano?