Κοινή χρήση τεχνολογίας

Γ: Η διαφορά μεταξύ σύνθεσης και κληρονομικότητας

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Εισαγωγή στη σύνθεση και σύγκριση με την κληρονομικότητα

τι είναι συνδυασμός
(1) Σύνθεση σημαίνει χρήση αντικειμένων πολλών άλλων κλάσεων ως μέλη σε μια κλάση.
(2) Χρησιμοποιήστε το δέντρο της τάξης για να εξηγήσετε περιπτώσεις
(3) Ο συνδυασμός είναι επίσης μια μέθοδος επαναχρησιμοποίησης κώδικα και η ουσία του είναιΔομήΠεριλαμβάνω

#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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

Εισαγάγετε την περιγραφή της εικόνας εδώ

Σύγκριση των χαρακτηριστικών κληρονομικότητας και σύνθεσης
(1) Η κληρονομιά είναι ένα είδος (είναι α) Η σχέση είναι μεταβατική και όχι συμμετρική.
(2) Ο συνδυασμός είναι η σχέση ενός μέρους του (έχει α),
(3) Η κληρονομικότητα είναι η επαναχρησιμοποίηση λευκού κουτιού. Επειδή η κληρονομικότητα κλάσης μας επιτρέπει να παρακάμψουμε τις λεπτομέρειες υλοποίησης της γονικής κλάσης σύμφωνα με τη δική μας υλοποίηση, η υλοποίηση της γονικής κλάσης είναι ορατή στη θυγατρική κλάση.
(4) Η δυνατότητα επαναχρησιμοποίησης λευκού κουτιού της κληρονομικότητας καταστρέφει τη δυνατότητα ενθυλάκωσης της κλάσης σε κάποιο βαθμό, επειδή θα εκθέσει τις λεπτομέρειες υλοποίησης της γονικής κλάσης στην υποκλάση.
(5) Ο συνδυασμός ανήκει στην επαναχρησιμοποίηση μαύρου κουτιού.Οι εσωτερικές λεπτομέρειες του περιεχομένου αντικειμένου είναι αόρατες στον έξω κόσμο, επομένως η ενθυλάκωσή του είναι σχετικά καλή και η αλληλεξάρτηση στην υλοποίηση είναι σχετικά μικρή.
(6) Η κλάση που περιλαμβάνεται στον συνδυασμό θα δημιουργηθεί και θα καταστραφεί καθώς δημιουργείται η κλάση που περιέχει. Οι συνδυασμοί είναι επαναχρησιμοποίηση μαύρου κουτιού και μπορούν να οριστούν δυναμικά κατά το χρόνο εκτέλεσης λαμβάνοντας άλλες αναφορές αντικειμένων ή δείκτες του ίδιου τύπου. Το μειονέκτημα είναι ότι υπάρχουν πάρα πολλά αντικείμενα στο σύστημα.
(7) Η αρχή σχεδίασης OO είναι να συνδυάζεται πρώτα και μετά να κληρονομείται.

Ζητήματα πολλαπλής κληρονομικότητας και αμφισημίας της

πολλαπλή κληρονομιά
(1) Πολλαπλή κληρονομικότητα σημαίνει ότι μια υποκλάση έχει πολλαπλές γονικές κλάσεις
(2) Πολλαπλή επίδειξη κληρονομιάς
(3) Δεν υπάρχει προφανής διαφορά μεταξύ των αρχών της πολλαπλής κληρονομιάς και της ενιαίας κληρονομιάς.
(4) Η πολλαπλή κληρονομικότητα μπορεί να οδηγήσει σε προβλήματα ασάφειας
Η ασάφεια της πολλαπλής κληρονομικότητας 1
(1) Σενάριο: Το C έχει πολλαπλή κληρονομιά από τους Α και Β, επομένως θα υπάρχει ασάφεια όταν καλείτε μέλη με τα ίδια ονόματα των Α και Β στο Γ.
(2) Λόγος: Το C κληρονομεί ένα μέλος με το ίδιο όνομα (διαφορετικό πεδίο ονομάτων) από το A και το B, επομένως όταν καλείτε με ένα αντικείμενο του C, ο μεταγλωττιστής δεν μπορεί να καθορίσει ποιο από αυτά θέλουμε να καλέσουμε.
(3) Λύση 1: Για να αποφύγετε το περιστατικό, αφήστε τα ονόματα των δημοσίων μελών του Α και του Β να μην έρχονται σε σύγκρουση επανειλημμένα. Αλλά αυτό μερικές φορές είναι ανεξέλεγκτο.
(4) Λύση 2: Καθορίστε ξεκάθαρα ποια να καλέσετε κατά την κωδικοποίηση, χρησιμοποιήστε cA::func() για να καθορίσετε ξεκάθαρα ότι καλείται η συνάρτηση της κλάσης Α αντί της συνάρτησης της κλάσης Β.
(5) Λύση 3: Επαναπροσδιορίστε τη συνάρτηση στο C, τότε η συνάρτηση στο C θα κληθεί και η συνάρτηση στα Α και Β θα είναι κρυφή.
(6) Περίληψη: Μπορεί να λυθεί, αλλά δεν υπάρχει καλή λύση.

Η ασάφεια της πολλαπλής κληρονομικότητας 2
(1) Σενάριο: πρόβλημα κληρονομικότητας διαμαντιών.Δηλαδή, το A είναι η προγονική κλάση, B1:A, B2:A, C:B1,B2 αυτή τη στιγμή, θα υπάρχει ασάφεια κατά τη χρήση του αντικειμένου του C για να καλέσετε μια μέθοδο στο A.
(2) Ανάλυση: η c.func() είναι διφορούμενη, η cA::func() είναι επίσης διφορούμενη, αλλά η c.B1::func() και η c.B2::func() δεν είναι διφορούμενες
(3) Λύση: Το ίδιο με το πρόβλημα 1, αλλά το πρόβλημα 2 είναι πιο λεπτό και πιο δύσκολο να αποφευχθεί

Εισαγάγετε την περιγραφή της εικόνας εδώ

// 祖类
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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

Η εικονική κληρονομικότητα λύνει το πρόβλημα της ασάφειας της κληρονομιάς διαμαντιών

Πώς να χρησιμοποιήσετε την εικονική κληρονομιά
(1) Σενάριο: Η κληρονομικότητα διαμαντιών οδηγεί σε προβλήματα ασάφειας Ουσιαστικά, υπάρχουν δύο αντικείμενα A που περιέχονται στο B1 και B2 στην κλάση εγγονών C, επομένως υπάρχει ασάφεια.
(2) Εικονική λύση κληρονομικότητας: Αφήστε τα Β1 και Β2 να κληρονομήσουν το Α εικονικά, και μετά ο Γ μπορεί να κληρονομήσει κανονικά τα Β1 και Β2.
(3) Η εικονική κληρονομικότητα είναι τόσο απλή. Δημιουργείται για να λύσει το πρόβλημα της ασάφειας της κληρονομιάς με διαμάντια.

Η αρχή εφαρμογής της εικονικής κληρονομιάς
(1) Η αρχή της εικονικής κληρονομικότητας είναι: εικονικός δείκτης πίνακα κλάσης βάσης vbptr και εικονικός πίνακας κλάσης βάσης εικονικός πίνακας
(2) Αναφορά:https://blog.csdn.net/xiejingfa/article/details/48028491

Εισαγάγετε την περιγραφή της εικόνας εδώ

Συνοψίζω

Κατανοήστε τι είναι ο συνδυασμός Υπάρχουν πολλές μεταβλητές μελών άλλων τύπων κλάσεων σε μια κλάση.
Κατανοήστε τη διαφορά μεταξύ σύνθεσης και κληρονομικότητας
Αμφισημία: Εάν εκτελέσετε μια συνάρτηση, μπορεί να μην είναι απαραίτητα αυτή που θέλετε να καθορίσετε.
Λύση: Χρησιμοποιήστε cA::func() για να καθορίσετε ρητά την κλάση που καλείται
Η εικονική κληρονομιά μοιάζει λίγο με τη σύνταξη υπό όρους. Δεν χρειάζεται να εισαχθεί επανειλημμένα για να επιτευχθεί το εφέ εισαγωγής.

Τα αρχεία μελέτης και οι επαφές παραβάσεων θα διαγραφούν.
Πηγή: Teacher Zhu’s Internet of Things Classroom