informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
apa itu kombinasi
(1) Komposisi berarti menggunakan objek dari beberapa kelas lain sebagai anggota dalam suatu kelas.
(2) Gunakan pohon kelas untuk menjelaskan kasus
(3) Kombinasi juga merupakan metode penggunaan kembali kode, dan esensinya adalahStrukturTermasuk
#include <iostream>
#include <vector>
#include <string>
// Leaf 类
class Leaf {
public:
Leaf(const std::string& color) : color_(color) {
std::cout << "Leaf constructor called: " << color_ << std::endl;
}
~Leaf() {
std::cout << "Leaf destructor called: " << color_ << std::endl;
}
void display() const {
std::cout << "Leaf color: " << color_ << std::endl;
}
private:
std::string color_;
};
// Branch 类
class Branch {
public:
Branch(int length) : length_(length) {
std::cout << "Branch constructor called: " << length_ << " cm" << std::endl;
}
~Branch() {
std::cout << "Branch destructor called: " << length_ << " cm" << std::endl;
}
void display() const {
std::cout << "Branch length: " << length_ << " cm" << std::endl;
}
private:
int length_;
};
// Tree 类,包含 Leaf 和 Branch 对象
class Tree {
public:
Tree(const std::string& leafColor, int branchLength)
: leaf_(leafColor), branch_(branchLength) {
std::cout << "Tree constructor called" << std::endl;
}
~Tree() {
std::cout << "Tree destructor called" << std::endl;
}
void display() const {
leaf_.display();
branch_.display();
}
private:
Leaf leaf_;
Branch branch_;
};
int main() {
Tree tree("Green", 150);
tree.display();
return 0;
}
Perbandingan ciri-ciri pewarisan dan susunannya
(1) Warisan adalah sejenis (adalah a) Hubungannya bersifat transitif dan tidak simetris.
(2) Kombinasi adalah hubungan suatu bagian (memiliki),
(3) Warisan adalah penggunaan kembali kotak putih. Karena pewarisan kelas memungkinkan kita untuk mengganti detail implementasi kelas induk sesuai dengan implementasi kita sendiri, implementasi kelas induk dapat dilihat oleh kelas anak.
(4) Fitur pewarisan kotak putih yang digunakan kembali menghancurkan fitur enkapsulasi kelas sampai batas tertentu, karena akan memaparkan detail implementasi kelas induk ke subkelas.
(5) Kombinasi tersebut termasuk dalam penggunaan kembali kotak hitam.Detail internal dari objek yang dikandungnya tidak terlihat oleh dunia luar, sehingga enkapsulasinya relatif baik dan saling ketergantungan dalam implementasinya relatif kecil.
(6) Kelas yang disertakan dalam kombinasi akan dibuat dan dimusnahkan seiring dengan dibuatnya kelas yang memuatnya. Kombinasi termasuk dalam penggunaan kembali kotak hitam dan dapat ditentukan secara dinamis saat runtime dengan memperoleh referensi atau penunjuk objek lain dengan tipe yang sama. Kerugiannya adalah terlalu banyak objek di dalam sistem.
(7) Prinsip desain OO adalah menggabungkan terlebih dahulu, kemudian mewarisi.
warisan ganda
(1) Warisan berganda berarti suatu subkelas memiliki beberapa kelas induk
(2) Demonstrasi warisan berganda
(3) Tidak ada perbedaan yang jelas antara asas pewarisan banyak dan pewarisan tunggal.
(4) Warisan berganda dapat menimbulkan masalah ambiguitas
Ambiguitas pewarisan berganda 1
(1) Skenario: C mempunyai pewarisan ganda dari A dan B, sehingga akan terjadi ambiguitas saat memanggil anggota dengan nama A dan B yang sama di C.
(2) Alasan: C mewarisi anggota dengan nama yang sama (domain namespace berbeda) dari A dan B, sehingga ketika memanggil dengan objek C, compiler tidak dapat menentukan mana yang ingin kita panggil.
(3) Solusi 1: Untuk menghindari hal tersebut, jangan sampai terjadi konflik berulang kali dalam penetapan nama anggota masyarakat A dan B. Namun hal ini terkadang tidak dapat dikendalikan.
(4) Solusi 2: Tentukan dengan jelas mana yang akan dipanggil saat pengkodean, gunakan cA::func() untuk menentukan dengan jelas bahwa fungsi kelas A dipanggil, bukan fungsi kelas B.
(5) Solusi 3: Definisikan ulang fungsi di C, maka fungsi di C akan dipanggil, dan fungsi di A dan B akan disembunyikan.
(6) Ringkasan: Bisa diatasi, tapi tidak ada solusi yang baik.
Ketidakjelasan pewarisan berganda2
(1) Skenario: masalah warisan berlian.Artinya, A adalah kelas leluhur, B1:A, B2:A, C:B1,B2 Saat ini, akan ada ambiguitas saat menggunakan objek C untuk memanggil metode di A.
(2) Analisis: c.func() bersifat ambigu, cA::func() juga ambigu, tetapi c.B1::func() dan c.B2::func() tidak ambigu
(3) Solusi: Sama seperti masalah 1, namun masalah 2 lebih halus dan sulit dihindari
// 祖类
class Aa {
public:
void show() { std::cout << "A's method" << std::endl; }
};
// 派生类 B1 和 B2,从 A 继承
class B1 : public Aa {
public:
void show() { std::cout << "B1's show" << std::endl; }
void showB1() { std::cout << "B1's method" << std::endl; }
};
class B2 : public Aa {
public:
void show() { std::cout << "B2's show" << std::endl; }
void showB2() { std::cout << "B2's method" << std::endl; }
};
// 派生类 C,从 B1 和 B2 继承
class C : public B1, public B2 {
public:
void showC() { std::cout << "C's method" << std::endl; }
};
int test070103() {
C c;
// c.Aa::show(); // 调用 A 的方法 不可以
c.Aa::B1::show(); // 调用 A 的方法 不可以
c.B2::Aa::show(); // 调用 A 的方法 不可以
c.B1::show(); // 调用 B1 的方法
c.B2::show(); // 调用 B2 的方法
c.showB1(); // 调用 B1 的方法
c.showB2(); // 调用 B2 的方法
c.showC(); // 调用 C 的方法
return 0;
}
Cara menggunakan warisan virtual
(1) Skenario: Warisan berlian menyebabkan masalah ambiguitas. Pada dasarnya, ada dua objek A yang terdapat di B1 dan B2 di kelas cucu C, sehingga terdapat ambiguitas.
(2) Solusi pewarisan virtual: Biarkan B1 dan B2 mewarisi A secara virtual, lalu C dapat mewarisi B1 dan B2 secara normal.
(3) Warisan virtual sesederhana itu. Ia dibuat untuk memecahkan masalah ambiguitas warisan berlian. Ia tidak memiliki hubungan langsung dengan fungsi virtual (untuk mencapai fitur polimorfik).
Prinsip penerapan pewarisan virtual
(1) Prinsip pewarisan virtual adalah: penunjuk tabel kelas dasar virtual vbptr dan tabel virtual tabel kelas dasar virtual
(2) Referensi:https://blog.csdn.net/xiejingfa/artikel/detail/48028491
Pahami apa itu kombinasi. Ada banyak variabel anggota tipe kelas lain dalam suatu kelas.
Pahami perbedaan antara komposisi dan warisan
Ambiguitas: Jika Anda menjalankan suatu fungsi, belum tentu fungsi tersebut ingin Anda tentukan.
Solusi: Gunakan cA::func() untuk secara eksplisit menentukan kelas yang dipanggil
Warisan virtual mirip dengan kompilasi bersyarat. Ia hanya perlu diperkenalkan satu kali. Tidak perlu diperkenalkan berulang kali untuk mencapai efek pengenalan.
Catatan studi dan kontak pelanggaran akan dihapus.
Sumber: Ruang Kelas Internet of Things Guru Zhu