Rumah >pembangunan bahagian belakang >C++ >Mengapakah Operator Tugasan Maya Diperlukan dalam C dan Bolehkah Operator Lain Dijadikan Maya?

Mengapakah Operator Tugasan Maya Diperlukan dalam C dan Bolehkah Operator Lain Dijadikan Maya?

Linda Hamilton
Linda Hamiltonasal
2024-12-21 01:08:10573semak imbas

Why is a Virtual Assignment Operator Necessary in C   and Can Other Operators Be Made Virtual?

Operator Tugasan Maya dalam C

Operator tugasan dalam C boleh diisytiharkan maya, tetapi persoalan asas timbul: mengapa ini perlu? Dan bolehkah pengendali lain dijadikan maya juga?

Adakah Operator Tugasan Wajib Menjadi Maya?

Bertentangan dengan kepercayaan popular, pengendali tugasan tidak semestinya diperlukan untuk menjadi maya.

Memahami Fungsi dan Parameter Maya Warisan

Fungsi maya mendayakan polimorfisme, membenarkan kelas terbitan mengatasi fungsi kelas asas. Walau bagaimanapun, adalah penting untuk memahami bahawa fungsi maya tidak menyedari pewarisan parameter.

Contoh Menunjukkan Had Pewarisan Parameter:

Pertimbangkan contoh berikut dengan kelas B dan D, di mana B mempunyai pengendali tugasan maya dan D mengatasi ia:

class B {
public:
  virtual B& operator=(const B& right) {
    x = right.x;
    return *this;
  }

  int x;
};

class D : public B {
public:
  virtual D& operator=(const D& right) {
    x = right.x;
    y = right.y;
    return *this;
  }
  int y;
};

Dalam senario ini, walaupun penetapan maya B::operator=, panggilan tidak dianggap sebagai fungsi maya dalam D kerana parameter dan nilai pulangan berbeza.

Operator Terlebih Beban dengan Nilai Lalai Menggunakan Maya

Walaupun operator penugasan tidak secara semula jadi maya, ia boleh memberi manfaat untuk mentakrifkan fungsi maya yang merangkumi nilai lalai untuk kelas terbitan.

class D : public B {
public:
  virtual D& operator=(const D& right) {
    x = right.x;
    y = right.y;
    return *this;
  }

  virtual B& operator=(const B& right) {
    x = right.x;
    y = 13; // Default value
    return *this;
  }

  int y;
};

Pendekatan ini membolehkan anda menetapkan nilai lalai kepada objek D apabila diberikan kepada rujukan B.

Menggunakan RTTI untuk Jenis Komprehensif Mengendalikan

Akhir sekali, anda boleh menggunakan Run-Time Type Information (RTTI) untuk mengendalikan fungsi maya yang melibatkan jenis anda dengan berkesan.

virtual B& operator=(const B& right) {
  const D *pD = dynamic_cast<const D*>(&right);
  if (pD) {
    x = pD->x;
    y = pD->y;
  } else {
    x = right.x;
    y = 13; // Default value
  }

  return *this;
}

Dengan menggabungkan teknik ini, anda boleh secara menyeluruh mengendalikan operasi tugasan yang melibatkan pewarisan dan memastikan tingkah laku yang betul untuk jenis terbitan.

Atas ialah kandungan terperinci Mengapakah Operator Tugasan Maya Diperlukan dalam C dan Bolehkah Operator Lain Dijadikan Maya?. 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