Rumah > pembangunan bahagian belakang > C++ > Apakah Perbezaan Antara Fungsi Maya Maya dan Tulen dalam Pengaturcaraan Berorientasikan Objek?

Apakah Perbezaan Antara Fungsi Maya Maya dan Tulen dalam Pengaturcaraan Berorientasikan Objek?

DDD
Lepaskan: 2024-12-26 02:21:10
asal
751 orang telah melayarinya

What's the Difference Between Virtual and Pure Virtual Functions in Object-Oriented Programming?

Memahami Fungsi Maya dan Tulen Maya

Fungsi maya memainkan peranan penting dalam pengaturcaraan berorientasikan objek dengan mendayakan polimorfisme masa jalan. Seperti yang ditakrifkan oleh Wikipedia, fungsi maya ialah kaedah atau fungsi boleh ganti yang membenarkan penghantaran dinamik. Ini bermakna fungsi khusus yang akan dilaksanakan ditentukan berdasarkan jenis objek pada masa jalan, dan bukannya pada masa penyusunan.

Berbeza dengan fungsi bukan maya, apabila fungsi maya ditindih dalam kelas terbitan , versi yang ditakrifkan dalam kelas paling banyak terbitan digunakan di seluruh hierarki kelas. Ini memastikan bahawa pelaksanaan fungsi yang paling khusus sentiasa digunakan.

Fungsi maya tulen, juga dikenali sebagai kaedah maya tulen, bawa konsep ini lebih jauh. Ia adalah fungsi maya yang mesti dilaksanakan dalam kelas terbitan jika kelas itu bukan abstrak. Oleh itu, fungsi maya tulen secara berkesan mewajibkan kehadiran gelagat tertentu dalam kelas terbitan.

Kelas abstrak ialah kelas yang mengandungi satu atau lebih fungsi maya tulen. Kelas sedemikian tidak boleh digunakan secara langsung; sebaliknya, kelas terbitan yang menyediakan pelaksanaan untuk semua fungsi maya tulen mesti digunakan.

Untuk menggambarkan perbezaan antara fungsi maya maya dan tulen, pertimbangkan C berikut kod:

Base.hpp:

struct Base {
    virtual ~Base() = default;
    virtual void foo() {
        std::cout << "Base::Foo" << std::endl;
    }
};
Salin selepas log masuk

Derived.hpp:

struct Derived : public Base {
    void foo() override {
        std::cout << "Derived::Foo" << std::endl;
    }
};
Salin selepas log masuk

utama .cpp:

int main() {
    Base base;
    base.foo();  // Calls Base::Foo

    Derived derived;
    derived.foo();  // Calls Derived::Foo

    Base* derived_as_base = &derived;
    derived_as_base->foo();  // Calls Derived::Foo (due to dynamic dispatch)
}
Salin selepas log masuk

Dalam kod ini, kelas Base mengandungi fungsi maya foo yang mencetak "Base::Foo." Kelas Derived mengatasi fungsi ini untuk mencetak "Derived::Foo." Apabila objek Base memanggil foo, outputnya ialah "Base::Foo." Walau bagaimanapun, apabila objek Terbitan (diakses sebagai penuding Pangkalan) memanggil foo, output ialah "Derived::Foo" disebabkan oleh penghantaran dinamik.

Sekarang, mari kita pertimbangkan maya tulen fungsi:

PureBase.hpp:

struct PureBase {
    virtual ~PureBase() = default;
    virtual void foo() = 0;  // Pure virtual function
};
Salin selepas log masuk

PureDerived.hpp:

struct PureDerived : public PureBase {
    void foo() override {
        std::cout << "PureDerived::Foo" << std::endl;
    }
};
Salin selepas log masuk

Dalam kod ini, kelas PureBase mengandungi foo fungsi maya tulen yang tidak ditakrifkan dalam kelas asas. Akibatnya, kelas PureBase adalah abstrak kerana ia tidak mempunyai pelaksanaan yang lengkap.

PureMain.cpp:

int main() {
    // error: cannot declare variable 'pureBase' to be of abstract type 'PureBase'
    // PureBase pureBase;
    // pureBase.foo();

    PureDerived pureDerived;
    pureDerived.foo();  // Calls PureDerived::Foo
}
Salin selepas log masuk

Dalam contoh ini, cuba membuat instantiate PureBase objek secara langsung mengakibatkan ralat pengkompil. Walau bagaimanapun, mencipta objek PureDerived dibenarkan kerana ia menyediakan pelaksanaan untuk fungsi foo.

Untuk meringkaskan, fungsi maya menyediakan penghantaran dinamik dan boleh ditindih dalam kelas terbitan. Fungsi maya tulen, sebaliknya, diperlukan untuk dilaksanakan dalam kelas terbitan dan menguatkuasakan tingkah laku tertentu. Bersama-sama, konsep ini memainkan peranan penting dalam mendayakan kefungsian polimorfik dalam pengaturcaraan berorientasikan objek.

Atas ialah kandungan terperinci Apakah Perbezaan Antara Fungsi Maya Maya dan Tulen dalam Pengaturcaraan Berorientasikan Objek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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