Wie man Dynamic Cast in C++ verwendet

Jinku Hu 12 Oktober 2023
Wie man Dynamic Cast in C++ verwendet

In diesem Artikel werden mehrere Methoden zur Verwendung von dynamischem Cast in C++ demonstriert.

Verwenden Sie dynamic_cast, um von einem Basisklassenzeiger zu einem abgeleiteten Zeiger zu konvertieren

dynamic_cast erlaubt es dem Programmierer, Zeiger und Referenzen auf Klassen in der gesamten Vererbungshierarchie zu konvertieren. Beispielsweise kann der Zeiger auf eine Basisklasse in einen Zeiger auf eine abgeleitete Klasse umgewandelt werden, so dass der Programmierer abgeleitete Klassenmember-Funktionen aufrufen kann.

dynamic_cast ist Teil der Run-Time Type Information (RTTI)-Funktion, die eine Möglichkeit bietet, zur Laufzeit statt zur Kompilierungszeit auf den Typ eines Objekts zuzugreifen.

Beachten Sie, dass dynamic_cast nicht verwendet werden kann, um zwischen den primitiven Typen wie int oder float zu konvertieren. Außerdem sollte man dynamic_cast nur verwenden, wenn die Basisklasse mindestens eine virtuelle Memberfunktion enthält. Im folgenden Beispiel deklarieren wir einen neuen Basis-Klassenzeiger und werfen ihn in den neuen Zeiger auf die Derived Klasse. Da dynamic_cast einen Null-Zeiger zurückgibt, können wir den Ausdruck in der if-Anweisung als Bedingung stellen, wenn der Cast erfolglos war.

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

struct Base {
  virtual ~Base() = default;
};

struct Derived : public Base {};

int main() {
  Base *bp = new Derived;
  if (Derived *dp = dynamic_cast<Derived *>(bp)) {
    cout << "Successful cast - can use the pointer to 'Derived' object dp"
         << endl;
  }

  delete bp;
  return EXIT_SUCCESS;
}

Ausgabe:

Successful cast - can use the pointer to 'Derived' object dp

Der Programmierer kann sicher auf das Objekt in der if-Sektion scope zugreifen und bei Bedarf Derived-Klassenmember-Methoden aufrufen. Beachten Sie jedoch, dass wir, da wir den Derived Klassentyp nach Base casten, in der 13. Zeile nach dem new Operator Derived angeben, da der folgende Code einen erfolglosen Cast ergeben würde:

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

struct Base {
  virtual ~Base() = default;
};

struct Derived : public Base {};

int main() {
  Base *bp = new Base;
  if (Derived *dp = dynamic_cast<Derived *>(bp)) {
    cout << "Successful cast - can use the pointer to 'Derived' object dp"
         << endl;
  }

  delete bp;
  return EXIT_SUCCESS;
}

Der andere Teil des RTTI-Merkmals ist der Operator typeid, der den Typ des gegebenen Ausdrucks zurückgibt. Er kann verwendet werden, um Typen von mehreren Ausdrücken zu vergleichen, wie im nächsten Codebeispiel gezeigt wird. Beachten Sie, dass bei der Verwendung des typeid-Operators die Kopfzeile <typeinfo> enthalten sein muss.

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

struct Base {
  virtual ~Base() = default;
};

struct Derived : public Base {};

int main() {
  Base *bp = new Derived;
  if (Derived *dp = dynamic_cast<Derived *>(bp)) {
    cout << "Successful cast - can use the pointer to 'Derived' object dp"
         << endl;
    if (typeid(*bp) == typeid(*dp)) {
      cout << "bp and dp are of same type" << endl;
    }
  }

  delete bp;
  return EXIT_SUCCESS;
}

Ausgabe:

Successful cast - can use the pointer to 'Derived' object dp
bp and dp are of same type
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Cast