Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi Maya C Ditimpa dengan Jenis Pulangan Berbeza?

Bolehkah Fungsi Maya C Ditimpa dengan Jenis Pulangan Berbeza?

DDD
DDDasal
2024-11-30 16:16:14389semak imbas

Can C   Virtual Functions Be Overridden with Different Return Types?

Mengatasi Fungsi Maya dengan Jenis Pulangan Berbeza dalam C

Salah satu ciri utama fungsi maya dalam C ialah keupayaan untuk mengatasinya dalam kelas terbitan untuk menyediakan pelaksanaan khusus. Walau bagaimanapun, ia tidak selalunya jelas sama ada ia dibenarkan untuk menggunakan jenis pulangan yang berbeza dalam fungsi mengatasi.

Dalam kebanyakan kes, jawapannya ialah ya, dengan syarat jenis pulangan mematuhi kekangan tertentu. Khususnya, jenis pulangan mestilah kovarian dengan jenis pulangan asal. Kovarians bermakna bahawa jenis pulangan bagi fungsi mengatasi mestilah subjenis jenis pulangan asal atau boleh ditukar secara tersirat kepadanya.

Pertimbangkan contoh berikut:

class Base {
public:
    virtual ~Base() {}

    virtual Base* clone() const = 0; // pure virtual function
};

class Derived: public Base {
public:
    virtual Derived* clone() const {
        return new Derived(*this);
    }
};

Dalam contoh ini, Kelas asas mentakrifkan klon fungsi maya tulen yang mengembalikan Pangkalan*. Kelas Derived mengatasi klon dan mengembalikan Derived*. Ini dibenarkan kerana Derived* ialah subjenis Base*.

Secara umum, sebarang jenis pemulangan fungsi tidak dianggap sebagai sebahagian daripada tandatangannya dalam C . Oleh itu, anda boleh mengatasi fungsi ahli dengan sebarang jenis pulangan asalkan ia memenuhi peraturan kovarians. Ini membolehkan kelas terbitan menyediakan pelaksanaan fungsi maya yang lebih khusus tanpa melanggar keperluan kontrak.

Atas ialah kandungan terperinci Bolehkah Fungsi Maya C Ditimpa dengan Jenis Pulangan Berbeza?. 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