Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah peranan yang dimainkan oleh fungsi maya dalam polimorfisme dalam C++?

Apakah peranan yang dimainkan oleh fungsi maya dalam polimorfisme dalam C++?

王林
王林asal
2024-06-05 20:55:001152semak imbas

Mencapai polimorfisme melalui pengikatan dinamik, fungsi maya membenarkan objek kelas terbitan untuk memanggil versi fungsi maya mereka sendiri, walaupun jika fungsi itu diisytiharkan oleh kelas asas. Khususnya: fungsi maya diisytiharkan dalam kelas asas dan menggunakan kata kunci maya. Pengkompil menggunakan jadual penunjuk maya untuk mencari secara dinamik pelaksanaan fungsi untuk jenis objek masa jalan. Objek kelas terbitan sentiasa memanggil versi fungsi mayanya sendiri, walaupun ia diisytiharkan oleh kelas asas.

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

Peranan fungsi maya dalam polimorfisme C++

Dalam pengaturcaraan berorientasikan objek (OOP), polimorfisme ialah ciri yang membolehkan objek bertindak balas kepada panggilan kaedah yang sama dengan cara yang berbeza. Dalam C++, fungsi maya mencapai polimorfisme melalui pengikatan dinamik.

Apakah fungsi maya?

Fungsi maya ialah fungsi ahli yang diisytiharkan dalam kelas asas dan ditindih oleh kelas terbitan. Apabila mengisytiharkan fungsi maya dalam kelas asas, gunakan awalan kata kunci maya. 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()

🎜Cara fungsi maya berfungsi🎜🎜🎜Apabila fungsi maya dipanggil, pengkompil tidak mencari pelaksanaan fungsi dalam kelas asas. Sebaliknya, ia mencari pelaksanaan fungsi untuk jenis objek runtime. Ini bermakna objek subkelas sentiasa memanggil versi fungsi mayanya sendiri, walaupun fungsi itu diisytiharkan oleh kelas asas. 🎜🎜🎜Jadual Penunjuk Maya🎜🎜🎜Panggilan fungsi maya melibatkan struktur data khas yang dipanggil jadual penunjuk maya. Untuk setiap kelas dengan fungsi maya, pengkompil mencipta jadual penunjuk maya yang mengandungi penunjuk kepada fungsi maya kelas. Apabila objek kelas terbitan dicipta, objek tersebut mengandungi penunjuk ke jadual penunjuk mayanya sendiri. 🎜🎜🎜Kes Praktikal🎜🎜🎜Pertimbangkan contoh berikut: 🎜rrreee🎜Dalam contoh ini, kelas Shape mengisytiharkan fungsi maya draw(). Kelas terbitan Rectangle dan Bulatan mengatasi kaedah draw() untuk menyediakan pelaksanaan tersuai untuk bentuk tertentu. Dalam fungsi main(), kami mencipta tatasusunan bentuk dan memanggil kaedah draw() untuk setiap bentuk. Walaupun semua bentuk diisytiharkan sebagai jenis kelas asas, mereka memanggil kaedah draw() yang betul berdasarkan jenis masa jalan sebenar, menunjukkan kuasa fungsi maya untuk mencapai polimorfisme dalam C++. 🎜

Atas ialah kandungan terperinci Apakah peranan yang dimainkan oleh fungsi maya dalam polimorfisme dalam C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn