Bei der Vererbung wandelt die Aufwärtstransformation die abgeleitete Klasse in die Basisklasse um, und die Abwärtstransformation wandelt die Basisklasse in die abgeleitete Klasse um. Upcasting ist sicher, Informationen können verloren gehen. Downcasting ist gefährlich. Sie müssen sicherstellen, dass die entsprechende abgeleitete Klasse vorhanden ist, andernfalls wird nullptr zurückgegeben.
Upcasting und Downcasting in der C++-Funktionsvererbung
In der objektorientierten Programmierung ist Vererbung das Schlüsselkonzept der Klassenhierarchie. Wenn eine Klasse eine andere Klasse (Basisklasse) erbt, erbt die erbende Klasse (abgeleitete Klasse) die Eigenschaften und Methoden der Basisklasse.
Upcast
Upcasting bezieht sich auf die Konvertierung eines abgeleiteten Klassenobjekts in eine Referenz oder einen Zeiger auf ein Basisklassenobjekt. Diese Typkonvertierung ist sicher, da das abgeleitete Klassenobjekt alle Daten und Methoden des Basisklassenobjekts enthält. Sie kann jedoch zu einem Informationsverlust führen, da auf die eindeutigen Methoden und Daten der abgeleiteten Klasse nach der Konvertierung nicht zugegriffen werden kann.
Syntax:
基类* 指针 = &派生类对象;
Downcasting
Downcasting bezieht sich auf die Konvertierung eines Basisklassenobjekts in eine Referenz oder einen Zeiger auf ein abgeleitetes Klassenobjekt. Diese Typkonvertierung ist gefährlich, da sie zu ungültigen Umwandlungen führen kann. Downcasting funktioniert nur, wenn das abgeleitete Klassenobjekt tatsächlich im Basisklassenobjekt vorhanden ist.
Syntax:
派生类* 指针 = dynamic_cast<派生类*>(基类对象);
Der dynamic_cast
-Operator führt eine Laufzeittypprüfung durch, um sicherzustellen, dass die Umwandlung sicher ist. Wenn die Umwandlung ungültig ist, gibt dynamic_cast
nullptr
zurück. dynamic_cast
操作符将执行运行时类型检查,以确保转换是安全的。如果转换无效,dynamic_cast
将返回 nullptr
。
实战案例
假设我们有一个 Shape
类作为基类,它有一个 getArea()
方法来计算形状的面积。派生类 Square
继承了 Shape
类,并添加了一个 getWidth()
方法来获取正方形的宽度。
Shape.h
class Shape { public: virtual double getArea() const = 0; };
Square.h
class Square : public Shape { public: explicit Square(double width); double getArea() const override; double getWidth() const; private: double width; };
main.cpp
#include "Shape.h" #include "Square.h" int main() { // 创建一个正方形对象 Square square(5.0); // 将正方形对象向上转型为形状对象 Shape* shape = □ // 通过形状对象调用 getArea() 方法 double area = shape->getArea(); std::cout << "正方形的面积: " << area << std::endl; // 将形状对象向下转型为正方形对象 Square* square2 = dynamic_cast<Square*>(shape); // 如果向下转型成功,则调用 getWidth() 方法 if (square2) { double width = square2->getWidth(); std::cout << "正方形的宽度: " << width << std::endl; } else { std::cout << "向下转型失败" << std::endl; } return 0; }
在这个例子中,我们创建了一个正方形对象,将其向上转型为形状对象,并调用了 getArea()
方法。然后,我们向下转型形状对象为正方形对象,并调用 getWidth()
Shape
-Klasse als Basisklasse, die über eine getArea()
-Methode zur Berechnung der Fläche einer Form verfügt. Die abgeleitete Klasse Square
erbt die Klasse Shape
und fügt eine Methode getWidth()
hinzu, um die Breite des Quadrats zu ermitteln. 🎜🎜🎜Shape.h🎜🎜rrreee🎜🎜Square.h🎜🎜rrreee🎜🎜main.cpp🎜🎜rrreee🎜In diesem Beispiel erstellen wir ein quadratisches Objekt, wandeln es in ein Formobjekt um und rufen getArea( )-Methode. Dann wandeln wir das Formobjekt in ein quadratisches Objekt um und rufen die Methode getWidth()
auf. 🎜Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der C++-Funktionsvererbung: Was sind Upcasting und Downcasting?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!