Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Fungsi maya dan pengikatan dinamik dalam fungsi C++ membebankan dan menulis semula

Fungsi maya dan pengikatan dinamik dalam fungsi C++ membebankan dan menulis semula

WBOY
WBOYasal
2024-04-20 14:09:01658semak imbas

Melebihi beban dan menulis semula fungsi: Melebihkan fungsi membenarkan penciptaan fungsi dengan nama yang sama dengan senarai parameter berbeza dalam kelas yang sama, manakala mengatasi fungsi adalah untuk mengatasi fungsi nama yang sama kelas asas dengan subkelas dalam perhubungan warisan. Fungsi maya dan pengikatan dinamik: Fungsi maya membenarkan subkelas melaksanakan kaedah kelas induk dengan cara mereka sendiri dan mengisytiharkannya dengan kata kunci maya dalam tandatangan fungsi. Pengikatan dinamik menentukan pelaksanaan fungsi yang dipanggil semasa runtime, dan ia berlaku apabila penunjuk kelas induk menunjuk ke objek kelas anak. Dalam kes mengatasi, walaupun fungsi maya dipanggil melalui penunjuk kelas induk, pelaksanaan subkelas juga akan dipanggil, yang mencerminkan kelebihan pengikatan dinamik.

C++ 函数重载和重写中的虚函数与动态绑定

Fungsi berlebihan dan penulisan semula dalam C++: peranan fungsi maya dan pengikatan dinamik

Dalam C++, lebihan beban dan penulisan semula fungsi ialah dua konsep utama yang boleh mencapai skalabiliti dan fleksibiliti kod. Perbezaan di antara mereka ialah:

  • Fungsi berlebihan: Dalam kelas yang sama, fungsi dengan senarai parameter berbeza mempunyai nama yang sama.
  • Peningkatan Fungsi: Dalam perhubungan warisan, fungsi dalam subkelas mengatasi fungsi dalam kelas asas dengan nama dan senarai parameter yang sama.

Fungsi maya dan pengikatan dinamik memainkan peranan penting dalam penulisan semula fungsi.

Fungsi maya

Fungsi maya ialah fungsi khas yang membenarkan subkelas melaksanakan kaedah kelas induk dengan cara yang berbeza. Ia diisytiharkan dengan menyatakan kata kunci virtual dalam tandatangan fungsi. Contohnya: virtual 关键字来声明。例如:

class Base {
public:
    virtual void print() { cout << "Base class print" << endl; }
};

动态绑定

动态绑定是在运行时确定调用哪个函数实现版本的过程。当父类指针指向子类对象时,就会发生动态绑定。例如:

Base* basePtr = new Derived();  // 指向 Derived 对象的 Base 指针
basePtr->print();  // 调用 Derived::print()

在重写的情况下,子类对虚函数的实现将被调用,即使通过父类指针进行调用,这是动态绑定的优点之一。

实战案例

考虑以下代码,它展示了函数重写和虚函数如何在实际场景中协同工作:

class Animal {
public:
    virtual string speak() { return "Default animal sound"; }
};

class Dog : public Animal {
public:
    virtual string speak() override { return "Woof"; }
};

class Cat : public Animal {
public:
    virtual string speak() override { return "Meow"; }
};

int main() {
    Animal* animalPtr;  // 声明父类指针

    // 分别创建 Dog 和 Cat 对象并将其分配给 animalPtr
    animalPtr = new Dog();
    cout << animalPtr->speak() << endl;  // 输出 "Woof"

    animalPtr = new Cat();
    cout << animalPtr->speak() << endl;  // 输出 "Meow"

    return 0;
}

在这个例子中,Animal 类包含一个虚函数 speak(),它被子类 DogCat 重写。当 animalPtr 指向不同的子类对象时,调用 speak()rrreee

Dynamic Binding

🎜🎜Dynamic binding ialah proses menentukan pada masa jalan versi pelaksanaan fungsi yang hendak dipanggil. Pengikatan dinamik berlaku apabila penunjuk kelas induk menunjuk ke objek kelas kanak-kanak. Contohnya: 🎜rrreee🎜Dalam kes overriding, pelaksanaan subkelas bagi fungsi maya akan dipanggil, walaupun ia dipanggil melalui penunjuk kelas induk, yang merupakan salah satu kelebihan pengikatan dinamik. 🎜🎜🎜Contoh Praktikal🎜🎜🎜Pertimbangkan kod berikut, yang menunjukkan cara mengatasi fungsi dan fungsi maya berfungsi bersama dalam senario dunia sebenar: 🎜rrreee🎜Dalam contoh ini, kelas Animal mengandungi maya fungsi speak(), yang ditindih oleh subkelas Dog dan Cat. Apabila animalPtr menghala ke objek subkelas yang berbeza, memanggil speak() akan mengikat secara dinamik mengikut jenis objek sebenar, dengan itu mengeluarkan bunyi yang berbeza. 🎜🎜Dengan menggunakan fungsi maya dan pengikatan dinamik, kami boleh menulis kod yang fleksibel dan boleh diperluas, serta boleh memilih pelaksanaan fungsi yang berbeza mengikut jenis objek semasa masa jalan. 🎜

Atas ialah kandungan terperinci Fungsi maya dan pengikatan dinamik dalam fungsi C++ membebankan dan menulis semula. 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