Ich arbeite derzeit an der Integration eines Pakets von Drittanbietern, das viele RTTI-Sachen auf einer Nicht-RTTI-Plattform (Android) verwendet. Grundsätzlich habe ich meine eigene RTTI-Implementierung gemacht, aber ich stecke auf einem Problem fest.C++ - Downcasting eines Diamond Shape geerbten Objekts ohne RTTI/dynamic_cast
Das Problem ist, dass viele Klassen das Problem der Diamantvererbung haben, da alle Klassen von derselben Basisklasse (Objekt) abgeleitet sind. Wenn ich also von der Basisklasse in die abgeleitete Klasse umwandeln möchte, Ich muss einen dynamic_cast verwenden - aber RTTI ist nicht verfügbar! Wie konvertiere ich ein Objekt von Eltern zu Kind, wenn es eine virtuelle Vererbung ohne dynamic_cast gibt?
Es sieht wie folgt aus:
class A
{
public:
virtual char* func() { return "A"; };
};
class B : public virtual A
{
public:
//virtual char* func() { return "B"; };
};
class C : public virtual A
{
public:
//virtual char* func() { return "C"; };
};
class D : public B, public C
{
public:
//virtual char* func() { return "D"; };
};
D d;
A* pa = static_cast<A*>(&d);
D* pd = static_cast<D*>(pa); // can't do that! dynamic_cast does work though...
sind meine Fehler sind:
Fehler C2635: kann nicht konvertiert ein 'A *' zu einem 'D *'; Umwandlung von einer virtuellen Basisklasse
impliziertFehler C2440: 'initialisieren': von nicht konvertieren 'test_convert :: A *' zu 'test_convert :: D *' Cast von der Basis abgeleitet erfordert dynamic_cast oder static_cast
Irgendwelche Ideen?
heh, gut MS sagt nur, das virtuelle Schlüsselwort aus dem Code zu entfernen, und es wird das Problem lösen. Siehe ihre Dokumentation für den Fehler, ich mache keine Witze. –
Hum ... naja, das bringt mir den Fehler 2594 (siehe http://msdn.microsoft.com/en-us/library/5xata8be.aspx). Um dies zu beheben, schlagen sie vor, eine Umwandlungssequenz zu verwenden, wie "static_cast (static_cast (p));". Die Idee ist gut, aber wir können das nur tun, wenn wir genau den gesamten Vererbungsbaum kennen ... und das ist nicht immer der Fall. Dies setzt jedoch voraus, dass die virtuelle Elternklasse dupliziert werden kann (in meinem Fall ist es in Ordnung). Also werde ich es ausprobieren ... aber um das zu tun, muss ich einen Weg finden, die Hierarchie von einem Elternteil zum anderen zu bringen. –
Adam
Wer zum Teufel hat dir gesagt, Android ist eine Nicht-RTTI-Plattform? Das r5 und neuere NDK sollte RTTI unterstützen (ich glaube, Sie müssen es mit '-frtti' einschalten, aber es sollte dann funktionieren). Auch für ältere Plattformen, da alles statisch verknüpft ist. –