Fungsi maya C++ dan penghantaran dinamik: memahami mekanisme panggilan kaedah masa jalan

王林
Lepaskan: 2024-04-28 18:03:01
asal
807 orang telah melayarinya

Fungsi maya membenarkan kelas terbitan mengatasi kaedah kelas asas, dan penghantaran dinamik menentukan fungsi mana yang perlu dipanggil pada masa jalan berdasarkan jenis objek. Langkah khusus termasuk: mengisytiharkan fungsi maya melalui maya, membenarkan kelas terbitan mengatasinya. Gantikan fungsi maya dalam kelas terbitan untuk menyediakan pelaksanaan khusus. Panggil fungsi maya menggunakan penunjuk atau rujukan kepada objek, dan pengkompil akan mencari dan melaksanakan fungsi yang betul dalam jadual fungsi maya berdasarkan jenis objek semasa runtime.

C++ 虚拟函数与动态调派:理解运行时方法调用的机制

C++ Fungsi Maya dan Penghantaran Dinamik: Memahami Mekanisme Panggilan Kaedah Runtime

Pengenalan

Fungsi maya ialah ciri yang berkuasa untuk menggantikan kelas dalam C++ kaedah asas yang Artikel ini akan menyelidiki mekanisme fungsi maya dan penghantaran dinamik, dan menunjukkannya melalui kes praktikal.

Fungsi maya

Fungsi maya diisytiharkan dengan menambahkan kata kunci maya sebelum pengisytiharan fungsi. Ini menunjukkan bahawa fungsi itu boleh ditindih dalam kelas terbitan. Apabila fungsi maya pada objek dipanggil, fungsi sebenar yang dipanggil ditentukan berdasarkan jenis objek semasa program berjalan. virtual 关键字声明的。这表明该函数可以在派生类中被重写。当调用一个对象上的虚拟函数时,实际调用的函数是根据程序运行时的对象类型决定的。

动态调派

动态调派是使用虚函数的一种机制,它允许在运行时确定要调用的函数。当调用一个对象的虚拟函数时,编译器会在对象所属类的虚函数表中查找该函数,并执行找到的函数。

实战案例

以下是一个演示虚拟函数和动态调派的实战案例:

#include <iostream>

class Shape {
public:
    virtual double area() = 0; // 纯虚函数
};

class Rectangle : public Shape {
public:
    Rectangle(double width, double height) : _width(width), _height(height) {}
    double area() override { return _width * _height; }

private:
    double _width;
    double _height;
};

class Circle : public Shape {
public:
    Circle(double radius) : _radius(radius) {}
    double area() override { return 3.14 * _radius * _radius; }

private:
    double _radius;
};

int main() {
    Shape* shapes[] = { new Rectangle(2, 3), new Circle(4) };
    for (Shape* shape : shapes) {
        std::cout << shape->area() << std::endl; // 动态调派
    }
    return 0;
}
Salin selepas log masuk

在这个示例中,Shape 是一个抽象基类,它有一个纯虚函数 area()RectangleCircle 是派生类,实现了 area() 函数并提供了不同的实现。在 main 函数中,我们创建了一个 Shape 指针数组。虽然这些指针指向不同的类型,但我们能够通过该数组统一调用 area()

Penghantaran dinamik

Penghantaran dinamik ialah mekanisme menggunakan fungsi maya yang membolehkan fungsi dipanggil untuk ditentukan pada masa jalan. Apabila fungsi maya objek dipanggil, pengkompil mencari fungsi dalam jadual fungsi maya kelas yang objek itu dimiliki dan melaksanakan fungsi yang ditemui.

🎜Satu kes praktikal🎜🎜🎜Berikut ialah kes praktikal yang menunjukkan fungsi maya dan penghantaran dinamik: 🎜rrreee🎜Dalam contoh ini, Shape ialah kelas asas abstrak, yang mempunyai fungsi maya tulenkawasan(). Rectangle dan Circle ialah kelas terbitan yang melaksanakan fungsi area() dan menyediakan pelaksanaan yang berbeza. Dalam fungsi utama, kami mencipta tatasusunan penunjuk Shape. Walaupun penunjuk ini menunjuk kepada jenis yang berbeza, kita boleh memanggil fungsi area() secara seragam melalui tatasusunan, dan pengkompil akan melaksanakan fungsi yang betul dalam kelas terbitan yang sesuai berdasarkan jenis masa jalan. 🎜🎜🎜Kesimpulan🎜🎜🎜Fungsi maya dan penghantaran dinamik ialah mekanisme berkuasa dalam C++ yang membenarkan penyeruan kaedah fleksibel dan polimorfisme masa jalan. Memahami mekanisme ini adalah penting untuk menulis kod yang teguh dan berskala. 🎜

Atas ialah kandungan terperinci Fungsi maya C++ dan penghantaran dinamik: memahami mekanisme panggilan kaedah masa jalan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan