Suche…


Name eines Typs

Sie können den implementierungsdefinierten Namen eines Typs in Runtime abrufen, indem Sie die Member-Funktion .name() des von typeid std::type_info Objekts std::type_info typeid .

#include <iostream>
#include <typeinfo>

int main()
{
    int speed = 110;

    std::cout << typeid(speed).name() << '\n';
}

Ausgabe (implementierungsdefiniert):

int

dynamischer_cast

Verwenden Sie dynamic_cast<>() als Funktion, die Ihnen hilft, eine Vererbungshierarchie ( Hauptbeschreibung ) dynamic_cast<>() .

Wenn Sie für einige abgeleitete Klassen B und C einige nicht polymorphe Arbeiten ausführen müssen, aber die Basisklasse class A , schreiben Sie folgendermaßen

class A { public: virtual ~A(){} };

class B: public A
{ public: void work4B(){} };

class C: public A
{ public: void work4C(){} };

void non_polymorphic_work(A* ap)
{
  if (B* bp =dynamic_cast<B*>(ap))
    bp->work4B(); 
  if (C* cp =dynamic_cast<C*>(ap))
    cp->work4C(); 
}

Das typid-Schlüsselwort

Das Schlüsselwort typeid ist ein typeid Operator, der Informationen zum Laufzeittyp über seinen Operanden liefert, wenn der Typ des Operanden ein polymorpher Klassentyp ist. Es gibt einen Wert vom Typ const std::type_info . Lebenslauf-Qualifikation auf oberster Ebene wird ignoriert.

struct Base {
    virtual ~Base() = default;
};
struct Derived : Base {};
Base* b = new Derived;
assert(typeid(*b) == typeid(Derived{})); // OK

typeid kann auch direkt auf einen Typ angewendet werden. In diesem Fall werden die ersten Verweise auf oberster Ebene entfernt, und die cv-Qualifizierung auf oberster Ebene wird ignoriert. Das obige Beispiel hätte also mit typeid(Derived) anstelle von typeid(Derived{}) :

assert(typeid(*b) == typeid(Derived{})); // OK

Wenn typeid auf einen Ausdruck angewendet wird, der nicht vom polymorphen Klassentyp ist, wird der Operand nicht ausgewertet, und die Typinfo wird für den statischen Typ zurückgegeben.

struct Base {
    // note: no virtual destructor
};
struct Derived : Base {};
Derived d;
Base& b = d;
assert(typeid(b) == typeid(Base)); // not Derived
assert(typeid(std::declval<Base>()) == typeid(Base)); // OK because unevaluated

Wann welcher Cast in C ++ verwendet wird

Verwenden Sie dynamic_cast zum Konvertieren von Zeigern / Referenzen innerhalb einer Vererbungshierarchie.

Verwenden Sie static_cast für normale Typkonvertierungen.

Verwenden Sie reinterpret_cast, um Bitmuster auf niedriger Ebene neu zu interpretieren. Mit äußerster Vorsicht verwenden.

Verwenden Sie const_cast, um const / volatile zu verwerfen . Vermeiden Sie dies, wenn Sie nicht mit einer const-wrong API arbeiten.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow