प्रौद्योगिकी साझेदारी

ग: रचनायाः उत्तराधिकारस्य च भेदः

2024-07-12

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

रचनापरिचयः उत्तराधिकारेण सह तुलना च

किं संयोगः
(१) रचनायाः अर्थः अन्यस्य बहुविधवर्गस्य वस्तुनः वर्गस्य अन्तः सदस्यत्वेन उपयोगः भवति ।
(2) प्रकरणानाम् व्याख्यानार्थं वर्गवृक्षस्य उपयोगं कुर्वन्तु
(३) संयोजनम् अपि कोडपुनर्प्रयोगविधिः अस्ति, तस्य सारः च अस्तिसंरचनानिहितः

#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)उत्तराधिकारः एकप्रकारः (अस्ति क) सम्बन्धः संक्रामकः न तु सममितः।
(२) संयोगः (अस्ति क) इति भागस्य सम्बन्धः, २.
(३) उत्तराधिकारः श्वेत-पेटी-पुनर्प्रयोगः अस्ति। यतो हि वर्गस्य उत्तराधिकारः अस्मान् स्वस्य कार्यान्वयनस्य अनुसारं मातापितृवर्गस्य कार्यान्वयनविवरणं अधिलिखितुं शक्नोति, मातापितृवर्गस्य कार्यान्वयनम् बालवर्गस्य कृते दृश्यते
(4) उत्तराधिकारस्य श्वेत-पेटी-पुनर्प्रयोग-विशेषता वर्गस्य एन्कैप्सुलेशन-विशेषतां किञ्चित्पर्यन्तं नष्टं करोति, यतः एतत् मातापितृवर्गस्य कार्यान्वयनविवरणं उपवर्गस्य समक्षं उजागरयिष्यति
(५) संयोजनं कृष्णपेटीपुनर्प्रयोगस्य अस्ति।समाहितस्य वस्तुनः आन्तरिकविवरणानि बाह्यजगति न दृश्यन्ते, अतः तस्य समापनम् तुल्यकालिकरूपेण उत्तमम् अस्ति तथा च कार्यान्वयनस्य परस्परनिर्भरता तुल्यकालिकरूपेण अल्पा भवति
(6) यथा यथा समाहितवर्गस्य निर्माणं भवति तथा तथा संयोजने समाविष्टः वर्गः निर्मितः नष्टश्च भविष्यति। संयोजनानि कृष्ण-पेटी-पुनः उपयोगः भवति तथा च अन्य-वस्तु-सन्दर्भान् अथवा समानप्रकारस्य सूचकान् प्राप्य रनटाइम्-समये गतिशीलरूपेण परिभाषितुं शक्यते । दोषः अस्ति यत् व्यवस्थायां बहुवस्तूनि सन्ति ।
(7) OO डिजाइन सिद्धान्तः प्रथमं संयोजनं करणीयम्, ततः उत्तराधिकारः भवति।

बहुविधं उत्तराधिकारं तस्य अस्पष्टतायाः विषयाः च

बहु उत्तराधिकारः
(१) बहुविरासतस्य अर्थः अस्ति यत् उपवर्गस्य बहुविधाः मातापितृवर्गाः सन्ति
(2)बहुविरासतप्रदर्शनम्
(३) बहुवंशस्य एकवंशस्य च सिद्धान्तयोः स्पष्टः भेदः नास्ति ।
(४) बहुविधं उत्तराधिकारं अस्पष्टतायाः समस्यां जनयितुं शक्नोति
बहुविरासतस्य अस्पष्टता १
(1) परिदृश्यम् : ग इत्यस्य क तथा ख इत्येतयोः बहुविधं उत्तराधिकारः अस्ति, अतः ग मध्ये क तथा ख इत्येतयोः समाननामयुक्तान् सदस्यान् आह्वयति समये अस्पष्टता भविष्यति।
(2) कारणम् : C A तथा B इत्यस्मात् समाननाम (विभिन्न नामस्थानक्षेत्रं) सदस्यं उत्तराधिकारं प्राप्नोति, अतः C इत्यस्य वस्तुना सह आह्वानं कुर्वन् संकलकः निर्धारयितुं न शक्नोति यत् वयं कस्य आह्वानं कर्तुम् इच्छामः
(३) समाधानम् १ : घटनां परिहरितुं क-खयोः सार्वजनिकसदस्यानां नामकरणं पुनः पुनः संघर्षं न कुर्वन्तु। किन्तु एतत् कदाचित् अनियंत्रितम् अस्ति।
(4) समाधानम् 2: कोडिंग् करणकाले कस्य आह्वानं कर्तव्यमिति स्पष्टतया निर्दिशन्तु, cA::func() इत्यस्य उपयोगेन स्पष्टतया निर्दिष्टं कुर्वन्तु यत् B वर्गस्य फंक्शन् इत्यस्य स्थाने A वर्गस्य func आह्वयति।
(5) समाधानं 3: C मध्ये func पुनः परिभाषयन्तु, ततः C मध्ये func आह्वयति, A तथा B मध्ये func गोपनीयं भविष्यति।
(6) सारांशः- समाधानं कर्तुं शक्यते, परन्तु सत्समाधानं नास्ति।

बहुविरासतस्य अस्पष्टता २
(1) परिदृश्यम् : हीरकविरासतसमस्या।अर्थात् A इति पूर्वजवर्गः, B1:A, B2:A, C:B1,B2 अस्मिन् समये A इत्यस्मिन् मेथड् आह्वयितुं C इत्यस्य ऑब्जेक्ट् इत्यस्य उपयोगं कुर्वन् अस्पष्टता भविष्यति ।
(2) विश्लेषणम् : c.func() अस्पष्टम्, cA::func() अपि अस्पष्टम् अस्ति, परन्तु c.B1::func() तथा c.B2::func() अस्पष्टौ न सन्ति
(३) समाधानम् : समस्या १ इत्यस्य समानं, परन्तु समस्या २ अधिका सूक्ष्मा, परिहारः कठिना च अस्ति

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

// 祖类
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) परिदृश्यम् : हीरकस्य उत्तराधिकारः अस्पष्टतायाः समस्यां जनयति मूलतः पौत्रवर्गे C मध्ये B1 तथा B2 इत्यत्र द्वौ A वस्तुनि सन्ति, अतः अस्पष्टता अस्ति।
(2) आभासी उत्तराधिकारसमाधानम् : B1 तथा B2 A वर्चुअल् रूपेण उत्तराधिकारं प्राप्नुवन्तु, ततः C B1 तथा B2 सामान्यतया उत्तराधिकारं प्राप्तुं शक्नोति।
(3) आभासी उत्तराधिकारः तावत् सरलः अस्ति ।

आभासी उत्तराधिकारस्य कार्यान्वयनसिद्धान्तः
(1) आभासी उत्तराधिकारस्य सिद्धान्तः अस्ति : आभासी आधारवर्गसारणी सूचकः vbptr तथा आभासी आधारवर्गसारणी आभासीसारणी
(2)सन्दर्भः : १.https://blog.csdn.net/xiejingfa/लेख/विवरण/48028491

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

सारांशं कुरुत

संयोजनं किम् इति अवगच्छन्तु वर्गवर्गे अन्यवर्गप्रकारस्य बहवः सदस्यचराः सन्ति ।
रचनायाः उत्तराधिकारस्य च भेदं ज्ञातव्यम्
अस्पष्टता : यदि भवान् कञ्चन कार्यं निष्पादयति तर्हि तत् भवता निर्दिष्टं न भवेत् ।
समाधानम् : आह्वानं क्रियमाणं वर्गं स्पष्टतया निर्दिष्टुं cA::func() इत्यस्य उपयोगं कुर्वन्तु
आभासी उत्तराधिकारः किञ्चित् सशर्तसंकलन इव अस्ति तस्य परिचयप्रभावं प्राप्तुं पुनः पुनः परिचयस्य आवश्यकता नास्ति ।

अध्ययनस्य अभिलेखाः उल्लङ्घनसम्पर्काः च विलोपिताः भविष्यन्ति।
स्रोतः : शिक्षकस्य झू इत्यस्य इन्टरनेट् आफ् थिङ्ग्स् कक्षा