Heim  >  Artikel  >  Backend-Entwicklung  >  Welche Rolle spielen virtuelle Funktionen beim Polymorphismus in C++?

Welche Rolle spielen virtuelle Funktionen beim Polymorphismus in C++?

王林
王林Original
2024-06-05 20:55:001150Durchsuche

Virtuelle Funktionen erreichen Polymorphismus durch dynamische Bindung und ermöglichen es abgeleiteten Klassenobjekten, ihre eigene Version virtueller Funktionen aufzurufen, selbst wenn die Funktion von der Basisklasse deklariert wird. Konkret: Virtuelle Funktionen werden in der Basisklasse deklariert und verwenden das Schlüsselwort virtual. Der Compiler verwendet eine virtuelle Zeigertabelle, um dynamisch nach der Funktionsimplementierung für den Laufzeitobjekttyp zu suchen. Ein abgeleitetes Klassenobjekt ruft immer seine eigene Version einer virtuellen Funktion auf, auch wenn diese von einer Basisklasse deklariert wird.

C++ 中虚函数在多态性中扮演什么角色?

Die Rolle virtueller Funktionen beim C++-Polymorphismus

Bei der objektorientierten Programmierung (OOP) ist Polymorphismus eine Funktion, die es einem Objekt ermöglicht, auf denselben Methodenaufruf auf unterschiedliche Weise zu reagieren. In C++ erreichen virtuelle Funktionen Polymorphismus durch dynamische Bindung.

Was ist eine virtuelle Funktion?

Virtuelle Funktionen sind Mitgliedsfunktionen, die in der Basisklasse deklariert und von der abgeleiteten Klasse überschrieben werden. Verwenden Sie beim Deklarieren virtueller Funktionen in einer Basisklasse das Schlüsselwortpräfix virtual. virtual 关键字前缀。

虚函数的工作原理

当调用虚函数时,编译器不会查找基类中的函数实现。相反,它会查找运行时对象类型的函数实现。这意味着子类对象始终调用其自身版本的虚函数,即使该函数是由基类声明的。

虚指针表

虚函数调用涉及称为虚指针表的特殊数据结构。对于每个具有虚函数的类,编译器都会创建一个虚指针表,其中包含指向该类虚函数的指针。当创建派生类对象时,该对象包含指向其自身虚指针表的指针。

实战案例

考虑以下示例:

class Shape {
public:
    virtual void draw() const = 0;
    // 其他函数和变量
};

class Rectangle : public Shape {
public:
    void draw() const override {
        // 绘制一个矩形
    }
};

class Circle : public Shape {
public:
    void draw() const override {
        // 绘制一个圆
    }
};

int main() {
    Shape* shapes[] = {new Rectangle(), new Circle()};
    for (Shape* shape : shapes) {
        shape->draw(); // 根据运行时类型调用正确的 draw() 方法
        delete shape;
    }
}

在这个示例中,Shape 类声明了一个虚函数 draw()。派生类 RectangleCircle 重写了 draw() 方法以提供针对特定形状的自定义实现。在 main() 函数中,我们创建了一个形状数组并对每个形状调用 draw() 方法。尽管所有形状都声明为基类类型,但它们会根据实际运行时类型调用正确的 draw()

🎜So funktionieren virtuelle Funktionen🎜🎜🎜Wenn eine virtuelle Funktion aufgerufen wird, sucht der Compiler nicht nach der Funktionsimplementierung in der Basisklasse. Stattdessen wird nach der Funktionsimplementierung für den Laufzeitobjekttyp gesucht. Dies bedeutet, dass ein Unterklassenobjekt immer seine eigene Version einer virtuellen Funktion aufruft, auch wenn die Funktion von der Basisklasse deklariert wird. 🎜🎜🎜Virtuelle Zeigertabelle🎜🎜🎜Virtuelle Funktionsaufrufe beinhalten eine spezielle Datenstruktur, die als virtuelle Zeigertabelle bezeichnet wird. Für jede Klasse mit virtuellen Funktionen erstellt der Compiler eine virtuelle Zeigertabelle, die Zeiger auf die virtuellen Funktionen der Klasse enthält. Wenn ein abgeleitetes Klassenobjekt erstellt wird, enthält das Objekt einen Zeiger auf seine eigene virtuelle Zeigertabelle. 🎜🎜🎜Praktischer Fall🎜🎜🎜Betrachten Sie das folgende Beispiel: 🎜rrreee🎜In diesem Beispiel deklariert die Klasse Shape eine virtuelle Funktion draw(). Abgeleitete Klassen Rectangle und Circle überschreiben die Methode draw(), um benutzerdefinierte Implementierungen für bestimmte Formen bereitzustellen. In der Funktion main() erstellen wir ein Array von Formen und rufen für jede Form die Methode draw() auf. Obwohl alle Formen als Basisklassentypen deklariert sind, rufen sie die richtige draw()-Methode basierend auf dem tatsächlichen Laufzeittyp auf und demonstrieren so die Leistungsfähigkeit virtueller Funktionen zum Erreichen von Polymorphismus in C++. 🎜

Das obige ist der detaillierte Inhalt vonWelche Rolle spielen virtuelle Funktionen beim Polymorphismus in C++?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn