Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membebankan Operator Kesaksamaan dengan Selamat dalam Hierarki Kelas?

Bagaimana untuk Membebankan Operator Kesaksamaan dengan Selamat dalam Hierarki Kelas?

Barbara Streisand
Barbara Streisandasal
2024-11-07 04:30:02304semak imbas

How to Safely Overload the Equality Operator in Class Hierarchies?

Operator Overloading untuk Hierarki Kelas: Pendekatan Komprehensif

Dalam bidang pengaturcaraan berorientasikan objek, selalunya dikehendaki untuk membandingkan objek kelas yang berkaitan untuk kesamarataan. Walau bagaimanapun, apabila berurusan dengan hierarki kelas, menentukan pendekatan yang betul untuk melebihkan pengendali kesaksamaan boleh menjadi satu cabaran.

Pertimbangkan hierarki kelas berikut:

class A
{
    int foo;
    virtual ~A() = 0;
};

A::~A() {}

class B : public A
{
    int bar;
};

class C : public A
{
    int baz;
};

Terdapat beberapa pendekatan untuk melebihkan beban pengendali kesaksamaan untuk hierarki sedemikian.

Fungsi Percuma

Operator beban berlebihan== kerana fungsi percuma membenarkan perbandingan langsung objek tanpa hantaran. Walau bagaimanapun, pendekatan ini menghalang memanfaatkan semakan kesamaan kelas asas (A) untuk kelas terbitan (B dan C).

Fungsi Ahli Maya

Menggunakan pendekatan fungsi ahli maya, kelas terbitan boleh mengatasi semakan kesaksamaan. Walau bagaimanapun, ini memerlukan pemutus dinamik untuk mengelak daripada membandingkan objek daripada jenis yang berbeza, yang boleh terasa verbose.

Pendekatan pilihan adalah mengikut prinsip yang digariskan oleh Scott Meyer "Effective C ":

Abstract Base Kelas

Elakkan mengisytiharkan kelas asas konkrit dan menjadikannya abstrak jika mereka tidak mempunyai pelaksanaan yang lengkap.

Fungsi Ahli Bukan Maya yang Dilindungi

Dalam kelas bukan daun, sediakan yang dilindungi fungsi pembantu bukan maya untuk semakan kesaksamaan (cth., isEqual()).

Fungsi Ahli Bukan Maya Awam

Dalam kelas daun, tentukan beban operator bukan maya awam yang berlebihan yang memanfaatkan pembantu fungsi dalam kelas asas.

bool operator==(const B& lhs, const B& rhs)
{
    return lhs.isEqual(rhs) && lhs.bar == rhs.bar;
}

Pendekatan ini menghalang sandaran yang tidak disengajakan dan memastikan keselamatan jenis apabila membandingkan objek daripada jenis yang berbeza.

Untuk semakan kesaksamaan merentas hierarki, pertimbangkan untuk menggunakan fungsi maya tulen dalam kelas asas yang ditindih dalam kelas terbitan.

bool B::pubIsEqual(const A& rhs) const
{
    const B* b = dynamic_cast<const B*>(&rhs);
    return b != NULL && *this == *b;
}

Dengan mematuhi prinsip ini, adalah mungkin untuk mencapai lebihan pengendali kesaksamaan yang mantap dan selamat jenis untuk hierarki kelas yang kompleks.

Atas ialah kandungan terperinci Bagaimana untuk Membebankan Operator Kesaksamaan dengan Selamat dalam Hierarki Kelas?. 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