2016-06-30 2 views
2

sagen, dass ich, dass ich diese Klassen:Gibt es eine Möglichkeit, dynamic_cast beim Casting zu einem Kind zu verwenden?

struct Parent {}; 
struct Child : public Parent { 
    void func() {} 
}; 

Jetzt sagen, dass ich eine Funktion wie diese schaffen wollte:

void foo(Parent* arg) { 
    auto child = dynamic_cast<Child*>(arg); 

    if(child != nullptr) child->func(); 
} 

Aber offensichtlich das wird mir offenbar gibt den Fehler:

dynamic_cast : Parent is not a polymorphic type

So kann ich nicht den dynamic_cast Schritt tun, gibt es eine Möglichkeit, die ich validieren kann, dass arg in der Tat einist 0 zur Laufzeit?

Antwort

5

Nein, das geht nicht. Die Informationen, die Sie zur Laufzeit über ein Objekt erhalten, werden mit der RTTI (Run Time Type Information) erreicht. Die RTTI eines Objekts wird in der virtuellen Tabelle seiner Klasse gespeichert. Alle Objekte einer polymorphen Klasse (d. H. Eine Klasse mit einer oder mehreren virtuellen Funktionen oder eine Klasse, die von einer polymorphen Klasse abgeleitet ist) enthalten vptr, was ein Zeiger auf die virtuelle Tabelle der entsprechenden Klasse ist. Ein Objekt eines nicht-polymorphen Typs hat keine vptr und es gibt keine virtuelle Tabelle für seine Klasse. Daher können Sie dynamic_cast nicht-polymorphe Typen verwenden.

So, wie @lorro sagte, sollten Sie eine virtuelle Funktion Parent hinzufügen, und die einfachste Möglichkeit, eine virtuelle destructor ist das Hinzufügen (die man sowieso tun sollten):

struct Parent { 
    virtual ~Parent() {} 
}; 
8

Geben Sie Ihrer Klasse Parent eine virtuelle Funktion. Destructor kommt aus mehreren Gründen (wie Löschen von Kind über Basis-PTR, usw.) in den Sinn.

Verwandte Themen