2017-10-16 6 views
3

in C++, Downcast ohne meine Destruktor virtuellen Ist es immer noch möglich, Pointer/Referenzen meiner nicht-polymorphe Basisklasse zu senken?Wie man mit nicht-polymorphe Basisklasse

+0

Ja * könnte * möglich sein, aber Sie müssen möglicherweise 'static_cast' oder' reininterpret_cast' verwenden. * Jedoch *, wenn die Basisklasse nicht polymorph ist und keinen virtuellen Destruktor hat, dann ist es vielleicht nicht die richtige Wahl, von ihr zu erben. Vielleicht solltest du stattdessen die Basisklasse als * Mitglied * haben? Was ist das * tatsächliche * Problem, das du lösen willst? * Warum * verwenden Sie Vererbung? –

+0

Also, ist es richtig zu sagen, dass ich nicht downcast, wenn meine Basisklasse nicht-polymorph ist (keine virtuelle Methode/Destruktor) – Adrika

+0

Mit 'dynamic_cast' ist es nicht möglich. –

Antwort

1

Virtueller Destruktor hat wenig mit Downcasting zu tun. Das Ziel, den Destruktor virtuell zu machen, ist das sichere Löschen durch Zeiger auf die Basis.

Base * ptr = new Derived; 
delete ptr; // undefined behavior if Base destructor isn't virtual 

einziehe kann static_cast durchgeführt werden, auf eigene Verantwortung

void processBase(Base * ptr) 
{ 
    // undefined behavior if ptr does not point to Derived 
    // object or some object that inherits from Derived 
    Derived * derived = static_cast<Derived *>(ptr); 
} 

Es gibt auch dynamic_cast, die überprüft, ob gesenkten legal ist, aber es erfordert, dass die Expression Punkte gegossen (oder) bezieht sich auf ein polymorphes Objekt (dh Objekt, das mindestens eine virtuelle Funktion deklariert oder geerbt hat).

5.2.7.6 Andernfalls v wird

Wenn der Typ des gegossenen Ausdrucks ein Zeiger auf oder ein L-Wert eines polymorphen Typs (10.3) seine nicht polymorph ist, kompilieren das Programm fehlschlagen.

Zusammenfassend - macht virtueller Destruktor macht Ihre Klasse polymorph, aber das gleiche wird durch die Deklaration einer anderen virtuellen Member-Funktion erreicht werden. Um dynamic_cast zu verwenden, benötigen Sie einen polymorphen Typ.

+0

'dynamic_cast' downcast auf einem nicht-polymorphen Typ ist schlecht gebildet. – Oktalist

+0

Es bedeutet, dass ich ein Problem habe, den Wortlaut im Standard zu verstehen. Da sie in diesem Abschnitt die Phrase "v hat einen Zeiger auf cv2 D" verwenden, und in diesem Abschnitt ist es wichtig, den Typ des Ausdrucks vom Typ des spitzen Objekts zu unterscheiden, nahm ich an, dass die Anforderung den vollständigen Typ des Verweises referenziert. Allerdings weist Ideon nicht polymorphe Ausdrücke zurück, also haben Sie recht. –

Verwandte Themen