පුද්ගලික, පොදු සහ ආරක්ෂිත උරුමය අතර වෙනස


Answers:


1087

එම ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා, සාමාජිකයන්ගේ ප්‍රවේශයන් පළමුව මගේ වචන වලින් විස්තර කිරීමට මම කැමතියි. ඔබ මෙය දැනටමත් දන්නේ නම්, "ඊළඟ:" යන මාතෘකාවට යන්න.

මම ගැන දන්නවා ඇති accessors තුනක් ඇත: public, protectedසහ private.

ඉඩ:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};
  • දන්නා සෑම දෙයක්ම අඩංගු වන Baseබව ද දනී .BasepublicMember
  • දරුවන් පමණක් (සහ ඔවුන්ගේ දරුවන්) බව ඔබ දන්නවා Baseඅඩංගු protectedMember.
  • කිසිවෙකු නමුත් Baseදැනුවත් නැත privateMember.

"දැනුවත්ව" යන්නෙන්, මම අදහස් කළේ "පැවැත්ම පිළිගෙන ඒ අනුව ප්‍රවේශ විය හැකි" යන්නයි.

ඊලඟ:

රාජ්‍ය, පෞද්ගලික සහ ආරක්ෂිත උරුමය සම්බන්ධයෙන් ද එය එසේම වේ. උරුම වන පන්තියක් Baseසහ පන්තියක් සලකා බලමු .ChildBase

  • උරුමය නම් public, දන්නා සෑම දෙයක්ම Baseහා Childද වන බව දන්නා Childඅනුන සිට Base.
  • උරුමය නම් protected, Childසහ එහි දරුවන් පමණක් , ඔවුන් උරුම වන බව දැන සිටිති Base.
  • උරුමය නම්, උරුමය ගැන privateවෙන කිසිවෙකු දන්නේ නැත Child.

191
C ++ හි දෘශ්‍යතාව පදනම් වී ඇත්තේ වස්තුව වෙනුවට පන්තිය මත බව වචන කිහිපයක් එක් කිරීමට මම කැමැත්තෙමි, එයින් අදහස් කරන්නේ එකම පන්තියේ වස්තූන් එකිනෙකාගේ පුද්ගලික ක්ෂේත්‍රයන්ට සීමාවකින් තොරව ප්‍රවේශ විය හැකි බවයි.
ෂේ චෙන්

49
ඔබට මෙය තේරුම් ගැනීමට අපහසු නම්, කිරිල් වී. ලියාඩ්වින්ස්කිගේ පිළිතුර කියවා නැවත පැමිණ මෙය කියවන්න.
විවාන්ඩියර්

6
මෙය තවත් අවස්ථාවකි, බොහෝ දුරට, උරුම කර ගැනීම, SomeBaseනිර්නාමික වර්ගයේ සාමාජිකයෙකු රචනා කිරීම සඳහා දැඩි කේත ක්‍රමයක් ලෙසට SomeBase. මෙය වෙනත් ඕනෑම සාමාජිකයෙකුට මෙන් ප්‍රවේශ ප්‍රවේශයක් ඇත, එය බාහිර ප්‍රවේශය මත එකම පාලනයක් ක්‍රියාත්මක කරයි.
underscore_d

1
FieldCheChen මා සතුව වස්තූන් තිබේ නම් ටොම් සහ ජෙරී පංතියේ පුද්ගලයාගේ පෞද්ගලික ක්ෂේත්‍ර වයස ඇති ඔබ ටොම් භාවිතා කරමින් ජෙරීගේ වයසට පිවිසෙන්නේ කෙසේද?
gen

2
“උරුමය” ගැන දැනුවත්ව සිටීමෙන් ඔබ අදහස් කරන දේ නිදර්ශනය කළ හැකිද? මට තේරුම් ගත හැකිය "මට මෙය ප්‍රවේශ කළ නොහැක මට එයට ප්‍රවේශ විය නොහැක" නමුත් "බී වෙතින් උරුමයක් ඇති බව මම දනිමි" යැයි කෙනෙකු පැවසූ විට මට එය නොලැබේ. මම මෙහි කරන්නේ කුමක්ද? මම උරුමය පරීක්ෂා කරන්නේද?
neilxdims

1481
class A 
{
public:
    int x;
protected:
    int y;
private:
    int z;
};

class B : public A
{
    // x is public
    // y is protected
    // z is not accessible from B
};

class C : protected A
{
    // x is protected
    // y is protected
    // z is not accessible from C
};

class D : private A    // 'private' is default for classes
{
    // x is private
    // y is private
    // z is not accessible from D
};

වැදගත් සටහන: බී, සී සහ ඩී පන්ති සියල්ලම x, y සහ z යන විචල්‍යයන් අඩංගු වේ. එය ප්‍රවේශය පිළිබඳ ප්‍රශ්නයකි.

ආරක්ෂිත සහ පෞද්ගලික උරුමය භාවිතා කිරීම පිළිබඳව ඔබට මෙහි කියවිය හැකිය .


36
ඇන්සුරියෝ ලියූ දෙය ක්ලික් කර ඇත්තේ ඔබගේ පිළිතුරට සමගාමීව පමණි. Плус 1.
Iwillnotexist Idonotexist

2
මෙය ක්‍රියාත්මක වන ආකාරය පිළිබඳ මගේ අවබෝධය ඉතා දුරයි! පැහැදිලි කිරීම ගැන ඔබට බොහෝම ස්තූතියි.
tjwrona1992

මෙය තේරුම් ගැනීමට මට යම් කාලයක් ගත විය. නමුත් දැන් එය පැහැදිලි ය. ස්තූතියි!
චාන් කිම්

පංති සඳහා පෙරනිමිය 'පුද්ගලික' වීම පිළිබඳ හොඳ සටහනක්.
ජෝන් ලියුන්හේගන්

116

උරුමයේ දෘශ්‍යතාව සීමා කිරීම මඟින් යම් පන්තියකට වෙනත් පන්තියක් උරුම වන බව කේතයට නොපෙනේ: ව්‍යුත්පන්නයේ සිට පාදම දක්වා ව්‍යංග පරිවර්තනයන් ක්‍රියා නොකරනු static_castඇති අතර පාදමේ සිට ව්‍යුත්පන්න දක්වා ක්‍රියා නොකරනු ඇත.

පුද්ගලික උරුමය දැකිය හැක්කේ පන්තියක සාමාජිකයින්ට / මිතුරන්ට පමණක් වන අතර ආරක්ෂිත උරුමය දැකිය හැක්කේ සාමාජිකයින්ට / මිතුරන්ට සහ ව්‍යුත්පන්න පංතිවලට පමණි.

පොදු උරුමය

  1. IS-A උරුමයක්. බොත්තමක් යනු කවුළුවක් වන අතර කවුළුවක් අවශ්‍ය ඕනෑම තැනක බොත්තමක් ද සම්මත කළ හැකිය.

    class button : public window { };

ආරක්ෂිත උරුමය

  1. ආරක්ෂිතව ක්‍රියාත්මක කරන ලද-අනුව. කලාතුරකින් ප්රයෝජනවත් වේ. භාවිතා boost::compressed_pair(උදාහරණයක් පහත අවස්ථාවක දී වීම තබා ගැනීමට සැකිල්ල භාවිත වන්නේ නැත) හිස් පදනම පන්ති ප්රශස්තිකරණය භාවිතා හිස් පන්ති සහ මතකය ඉතිරි ව්යුත්පන්න කිරීමට:

    struct empty_pair_impl : protected empty_class_1 
    { non_empty_class_2 second; };
    
    struct pair : private empty_pair_impl {
      non_empty_class_2 &second() {
        return this->second;
      }
    
      empty_class_1 &first() {
        return *this; // notice we return *this!
      }
    };

පෞද්ගලික උරුමය

  1. ක්‍රියාත්මක කිරීම. මූලික පන්තියේ භාවිතය ව්‍යුත්පන්න පන්තිය ක්‍රියාත්මක කිරීම සඳහා පමණි. ගති ලක්ෂණ සමඟ ප්‍රයෝජනවත් වන අතර ප්‍රමාණය වැදගත් නම් (කාර්යයන් පමණක් අඩංගු හිස් ගති ලක්ෂණ හිස් පාදක පන්ති ප්‍රශස්තිකරණය භාවිතා කරයි). බොහෝ විට පාලනය කිරීම වඩා හොඳ විසඳුම වේ. නූල් සඳහා ප්‍රමාණය ඉතා වැදගත් වේ, එබැවින් එය මෙහි බොහෝ විට දක්නට ලැබෙන භාවිතයකි

    template<typename StorageModel>
    struct string : private StorageModel {
    public:
      void realloc() {
        // uses inherited function
        StorageModel::realloc();
      }
    };

මහජන සාමාජිකයෙක්

  1. සමස්ථ

    class pair {
    public:
      First first;
      Second second;
    };
  2. ප්රවේශයන්

    class window {
    public:
        int getWidth() const;
    };

ආරක්ෂිත සාමාජිකයා

  1. ව්‍යුත්පන්න පංති සඳහා වැඩි දියුණු කළ ප්‍රවේශයක් සැපයීම

    class stack {
    protected:
      vector<element> c;
    };
    
    class window {
    protected:
      void registerClass(window_descriptor w);
    };

පෞද්ගලික සාමාජිකයෙක්

  1. ක්‍රියාත්මක කිරීමේ තොරතුරු තබා ගන්න

    class window {
    private:
      int width;
    };

සී-ස්ටයිල් කැස්ට් විසින් ව්‍යුත්පන්න කරන ලද පංතියක් ආරක්ෂිත හෝ පෞද්ගලික පාදක පන්තියකට නිර්වචනය කර ආරක්ෂිත ආකාරයකින් වාත්තු කිරීමට ඉඩ දෙන අතර අනෙක් දිශාවට ද දමන්න. මෙය සෑම වියදමකින්ම වළක්වා ගත යුතුය, මන්ද එය ක්‍රියාත්මක කිරීමේ තොරතුරු මත කේතය රඳා පැවතිය හැකි බැවිනි - නමුත් අවශ්‍ය නම් ඔබට මෙම තාක්ෂණය භාවිතා කළ හැකිය.


7
මම හිතන්නේ ස්කොට් මයර්ස් (මම ඔහුගේ දේවල් වලට කැමති තරමට) සාමාන්‍ය ව්‍යාකූලත්වයට පිළිතුරු දීමට බොහෝ දේ ඇත. මම දැන් සිතන්නේ ඔහුගේ IS-A සහ IS-IMPLEMENTED-IN-TERMS-OF යන ප්‍රතිසමයන් සිදුවෙමින් පවතින දෙයට ප්‍රමාණවත් බවයි.
DangerMouse

68

දෘශ්‍යතා උරුම ආකෘතිය නියම කිරීම සඳහා මෙම වචන තුන මුළුමනින්ම වෙනස් සන්දර්භයක භාවිතා වේ .

මෙම පංතිය උප පංතිය මුළුමනින්ම නිර්වචනය කර ඇති විට එහි ප්‍රති access ලයක් ලෙස සංරචක වෙත ප්‍රවේශය ඉදිරිපත් කරමින් සංරචක ප්‍රකාශනයේ සහ උරුම ආකෘතියේ ඇති විය හැකි සියලුම සංයෝජන රැස් කරයි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඉහත වගුව පහත පරිදි අර්ථ නිරූපණය කෙරේ (පළමු පේළිය දෙස බලන්න):

සංරචකයක් පොදු ලෙස ප්‍රකාශයට පත් කර එහි පන්තිය පොදු ලෙස උරුම වුවහොත් එහි ප්‍රති access ලය පොදු වේ.

උදාහරණයක්:

 class Super {
    public:      int p;
    private:     int q;
    protected:   int r;
 };

 class Sub : private Super {};

 class Subsub : public Sub {};

විචල්ය සඳහා ලැබෙන ප්රවේශ p, q, rපන්තියේ Subsub වේ කිසිවක් .

තවත් උදාහරණයක්:

class Super {
    private:     int x;
    protected:   int y;
    public:      int z;
 };
class Sub : protected Super {};

එහි ප්‍රති ing ලයක් ලෙස විචල්‍යයන් සඳහා වන ප්‍රවේශය y, zපන්තියේ උප තුළ ආරක්‍ෂිත වන අතර විචල්‍යය xසඳහා කිසිවක් නැත .

වඩාත් සවිස්තරාත්මක උදාහරණයක්:

class Super {
private:
    int storage;
public:
    void put(int val) { storage = val;  }
    int  get(void)    { return storage; }
};
int main(void) {
    Super object;

    object.put(100);
    object.put(object.get());
    cout << object.get() << endl;
    return 0;
}

දැන් උප පංතියක් අර්ථ දැක්වීමට ඉඩ දෙමු:

class Sub : Super { };

int main(void) {
    Sub object;

    object.put(100);
    object.put(object.get());
    cout << object.get() << endl;
    return 0;
}

නිර්වචනය කරන ලද පංතිය නම් කරන ලද පන්තියේ උප පංතියක් Superහෝ එම Subපන්තිය ව්‍යුත්පන්න කර ඇත්තේ Superපන්තියෙනි. මෙම Subපන්ති හඳුන්වාදෙයි වත් නව විචල්යයන් හෝ නව කාර්යයන්. Subපංතියේ කිසියම් වස්තුවක් පන්තියේ වස්තූන්ගේ Superපිටපතක් වීමෙන් පසුව සියලු ගති ලක්ෂණ උරුම වන බව එයින් අදහස් වේද Super?

නැත . එය එසේ නොවේ.

අපි පහත දැක්වෙන කේතය සම්පාදනය නම්, අපි කියා කිසිවක් නොව සම්පාදනය කිරිමේ දෝෂ ලැබෙනු ඇත putහා getක්රම ඇද හැලුණු වේ. මන්ද?

අපි දෘශ්‍යතා පිරිවිතරය අතහැර දැමූ විට, සම්පාදකයා උපකල්පනය කරන්නේ අප ඊනියා පුද්ගලික උරුමය යෙදීමට යන බවයි. එහි අර්ථය වන්නේ සියලුම පොදු සුපිරි පන්ති සංරචක පුද්ගලික ප්‍රවේශය බවට හැරවීම , පුද්ගලික සුපිරි පන්තියේ සංරචක කිසිසේත් ප්‍රවේශ විය නොහැකි බවයි. එහි ප්‍රති means ලයක් ලෙස උප පංතිය තුළ දෙවැන්න භාවිතා කිරීමට ඔබට අවසර නැත.

කලින් භාවිතා කළ ප්‍රවේශ ප්‍රතිපත්තිය ආරක්ෂා කිරීමට අපට අවශ්‍ය බව අපි සම්පාදකයාට දැනුම් දිය යුතුය.

class Sub : public Super { };

නොමඟ නොයන්න : සුපර් පංතියේ පුද්ගලික කොටස් (ගබඩා විචල්‍යය වැනි) තරමක් ඉන්ද්‍රජාලික ආකාරයකින් පොදු ඒවා බවට පත්වනු ඇතැයි එයින් අදහස් නොවේ. පෞද්ගලික සංරචක පවතිනු ඇත පෞද්ගලික , රාජ්ය පවතිනු ඇත මහජන .

Subපංතියේ වස්තූන් ඔවුන්ගේ වැඩිමහල් සහෝදර සහෝදරියන් Superපන්තියෙන් නිර්මාණය කළ ආකාරයටම "පාහේ" කළ හැකිය . "පාහේ" මක් නිසාද යත්, උප පංතියක් වීම යන්නෙන් අදහස් වන්නේ පන්තියට සුපිරි පන්තියේ පුද්ගලික කොටස් වෙත ප්‍රවේශය අහිමි වූ බවයි. Subගබඩා විචල්‍යය කෙලින්ම හැසිරවිය හැකි පන්තියේ සාමාජික ශ්‍රිතයක් අපට ලිවිය නොහැක .

මෙය ඉතා බරපතල සීමාවකි. කිසියම් විසඳුමක් තිබේද?

ඔව් .

තෙවන පිවිසුම් මට්ටම ආරක්ෂිත ලෙස හැඳින්වේ . ආරක්‍ෂිත යතුරු පදයේ අර්ථය නම්, එය සලකුණු කර ඇති සංරචකය ඕනෑම උප පංතියක් භාවිතා කරන විට පොදු එකක් ලෙස හැසිරෙන අතර එය සෙසු ලෝකයට පෞද්ගලික එකක් ලෙස පෙනේ . - මෙය සත්‍ය වන්නේ ප්‍රසිද්ධියේ උරුම වූ පන්ති සඳහා පමණි (අපගේ උදාහරණයේ ඇති සුපිරි පන්තිය වැනි) -

class Super {
protected:
    int storage;
public:
    void put(int val) { storage = val;  }
    int  get(void)    { return storage; }
};

class Sub : public Super {
public:
    void print(void) {cout << "storage = " << storage;}
};

int main(void) {
    Sub object;

    object.put(100);
    object.put(object.get() + 1);
    object.print();
    return 0;
}

උදාහරණ කේතයේ ඔබ දකින පරිදි අපි Subපන්තියට නව ක්‍රියාකාරිත්වයක් ලබා දෙන අතර එය එක් වැදගත් දෙයක් කරයි: එය සුපිරි පන්තියේ සිට ගබඩා විචල්‍යයට ප්‍රවේශ වේ.

විචල්‍යය පුද්ගලික යැයි ප්‍රකාශ කළහොත් එය කළ නොහැකි වනු ඇත. ප්‍රධාන ශ්‍රිත විෂය පථය තුළ විචල්‍යය කෙසේ හෝ සැඟවී ඇත, එබැවින් ඔබ එවැනි දෙයක් ලියන්නේ නම්:

object.storage = 0;

සම්පාදකයා එය බව ඔබට දන්වනු ඇත error: 'int Super::storage' is protected.

අවසාන වශයෙන්, අවසාන වැඩසටහන මඟින් පහත ප්‍රතිදානය නිපදවනු ඇත:

storage = 101

4
නවීකරණයක් නොමැතිකම (පංතියේ: සුපර් ක්ලාස් හි මෙන්) පළමුවෙන්ම සඳහන් කරයි. මෙය සවිස්තරාත්මක පැහැදිලි කිරීම් සමඟ අනෙක් අය අතපසු කරන වැදගත් කොටසකි. +1
ජලය

2
IMK ඉක්මවා යන්න, නමුත් මම මුලදී මේසයට කැමතියි.
cp.engr

65

එය පදනම් පංතියේ මහජන සාමාජිකයින් ව්‍යුත්පන්න පන්තියෙන් නිරාවරණය වන ආකාරය සමඟ සම්බන්ධ වේ.

  • public -> මූලික පන්තියේ පොදු සාමාජිකයන් පොදු වනු ඇත (සාමාන්‍යයෙන් පෙරනිමිය)
  • ආරක්ෂිත -> මූලික පන්තියේ මහජන සාමාජිකයන් ආරක්ෂා කරනු ඇත
  • private -> මූලික පන්තියේ මහජන සාමාජිකයන් පුද්ගලික වේ

ලිට්බ් පෙන්වා දෙන පරිදි, පොදු උරුමය යනු බොහෝ ක්‍රමලේඛන භාෂාවලින් ඔබ දකින සාම්ප්‍රදායික උරුමයකි. එය "IS-A" සම්බන්ධතාවයක් නිරූපණය කරයි. පුද්ගලික උරුමය, C ++ ට විශේෂිත වූ AFAIK යනු “නියමයන් තුළ ක්‍රියාත්මක” සම්බන්ධතාවයකි. ව්‍යුත්පන්න පන්තියේ පොදු අතුරුමුහුණත භාවිතා කිරීමට ඔබට අවශ්‍යය , නමුත් ව්‍යුත්පන්න පන්තියේ පරිශීලකයාට එම අතුරු මුහුණතට ප්‍රවේශය අවශ්‍ය නොවේ. බොහෝ අය තර්ක කරන්නේ මෙම අවස්ථාවේදී ඔබ මූලික පන්තිය එකතු කළ යුතු බවයි, එනම් මූලික පන්තිය පුද්ගලික පදනමක් ලෙස තබා ගැනීම වෙනුවට, පදනම් පන්තියේ ක්‍රියාකාරිත්වය නැවත භාවිතා කිරීම සඳහා ව්‍යුත්පන්න කළ සාමාජිකයෙකු බවට පත් කරන්න.


13
"පොදු: උරුමය සෑම කෙනෙකුටම පෙනෙනු ඇත" යනුවෙන් පැවසීම වඩා හොඳය. ආරක්ෂිතයි: උරුමය දකින්නේ ව්‍යුත්පන්න පංති සහ මිතුරන් පමණි "," පුද්ගලික: උරුමය පංතිය සහ මිතුරන් විසින් පමණක් දැකිය හැකිය ". මෙය ඔබේ වචන වලට වඩා වෙනස් ය, මන්ද සාමාජිකයින්ට පමණක් නොපෙනෙන බැවින් අයිඑස්-ඒ සම්බන්ධතාවය අදෘශ්‍යමාන විය හැකිය.
ජොහැන්නස් ෂෝබ් - ලිට්බ්

4
මම පුද්ගලික උරුමය භාවිතා කළ එක් වරක් වූයේ ඩග් ටී විස්තර කරන දේ කිරීමයි, එනම් "ඔබට ව්‍යුත්පන්න පන්තියේ පොදු අතුරුමුහුණත භාවිතා කිරීමට අවශ්‍යය, නමුත් ව්‍යුත්පන්න පන්තියේ පරිශීලකයාට එම අතුරුමුහුණතට ප්‍රවේශ වීමට අවශ්‍ය නැත". මම මූලික වශයෙන් එය භාවිතා කළේ පැරණි අතුරුමුහුණත මුද්‍රා තබා ව්‍යුත්පන්න පන්තිය හරහා තවත් එකක් නිරාවරණය කිරීමට ය.
පොහොසත්

37
Member in base class : Private   Protected   Public   

උරුමය වර්ගය :              වස්තුව උරුම වී ඇත්තේ :

Private            :   Inaccessible   Private     Private   
Protected          :   Inaccessible   Protected   Protected  
Public             :   Inaccessible   Protected   Public

23
මෙය නොමඟ යවන සුළුය. මූලික පංතියක පෞද්ගලික සාමාජිකයන් සාමාන්‍ය පෞද්ගලික පන්තියේ සාමාජිකයින්ට වඩා වෙනස් ලෙස හැසිරේ - ඔවුන්ට ව්‍යුත්පන්න පන්තියෙන් කිසිසේත් ප්‍රවේශ විය නොහැක. මම හිතන්නේ ඔබේ "පුද්ගලික" තුනේ තීරුව "ප්‍රවේශ කළ නොහැකි" තීරුවක් විය යුතුය. මෙම ප්‍රශ්නයට කිරිල් වී. ලියාඩ්වින්ස්කිගේ පිළිතුර බලන්න.
සෑම් කෝෆ්මන්

27

1) මහජන උරුමය :

ඒ. මූලික පන්තියේ පෞද්ගලික සාමාජිකයින්ට ව්‍යුත්පන්න පන්තියට ප්‍රවේශ විය නොහැක.

බී. ව්‍යුත්පන්න පංතියේ මූලික පංතියේ ආරක්ෂිත සාමාජිකයන් ආරක්ෂා කර ඇත.

ඇ. මූලික පන්තියේ මහජන සාමාජිකයන් ව්‍යුත්පන්න පන්තියේ ප්‍රසිද්ධියේ සිටිති.

එබැවින්, වෙනත් පංතිවලට ව්‍යුත්පන්න පංති වස්තුව හරහා මූලික පන්තියේ මහජන සාමාජිකයින් භාවිතා කළ හැකිය.

2) ආරක්ෂිත උරුමය :

ඒ. මූලික පන්තියේ පෞද්ගලික සාමාජිකයින්ට ව්‍යුත්පන්න පන්තියට ප්‍රවේශ විය නොහැක.

බී. ව්‍යුත්පන්න පංතියේ මූලික පංතියේ ආරක්ෂිත සාමාජිකයන් ආරක්ෂා කර ඇත.

ඇ. මූලික පංතියේ මහජන සාමාජිකයන් ද ව්‍යුත්පන්න පන්තියේ ආරක්ෂිත සාමාජිකයන් බවට පත්වේ.

එබැවින්, වෙනත් පංතිවලට ව්‍යුත්පන්න පන්ති වස්තුව හරහා මූලික පන්තියේ මහජන සාමාජිකයින් භාවිතා කළ නොහැක; නමුත් ඒවා ව්‍යුත්පන්න උප කාණ්ඩයට ලබා ගත හැකිය.

3) පුද්ගලික උරුමය :

ඒ. මූලික පන්තියේ පෞද්ගලික සාමාජිකයින්ට ව්‍යුත්පන්න පන්තියට ප්‍රවේශ විය නොහැක.

බී. මූලික පංතියේ ආරක්ෂිත සහ මහජන සාමාජිකයන් ව්‍යුත්පන්න පන්තියේ පෞද්ගලික සාමාජිකයන් බවට පත්වේ.

එබැවින්, ව්‍යුත්පන්න පන්තියේ කිසිදු සාමාජිකයෙකුට වෙනත් පන්ති වලට ව්‍යුත්පන්න පංති වස්තුව හරහා ප්‍රවේශ විය නොහැක. එබැවින්, ව්‍යුත්පන්න පන්තියේ උප පංතියට පවා ඒවාට ප්‍රවේශ විය නොහැක.


20

මහජන උරුමය IS-A සම්බන්ධතාවයක් නිරූපණය කරයි. සමඟ

class B {};
class D : public B {};

සෑම දෙයක්ම D B .

පුද්ගලික උරුමය IS-IMPLEMENTED-USING සම්බන්ධතාවයක් නිරූපණය කරයි (හෝ එය හැඳින්වෙන ඕනෑම දෙයක්). සමඟ

class B {};
class D : private B {};

එය Dවේ නොහැකි වූ Bනමුත්, සෑම Dඑහි භාවිතා Bඑය ක්රියාත්මක කිරීම ය. ඒ වෙනුවට බහාලුම් භාවිතා කිරීමෙන් පුද්ගලික උරුමය සෑම විටම ඉවත් කළ හැකිය:

class B {};
class D {
  private: 
    B b_;
};

මෙම D, ද, භාවිතා ක්රියාත්මක කළ හැකි Bඑහි භාවිතා කරමින් මෙම අවස්ථාවේ දී, b_. බහාලුම් යනු උරුමයට වඩා වර්ග අතර තද බැඳීමකි, එබැවින් පොදුවේ එය වඩාත් කැමති විය යුතුය. සමහර විට පුද්ගලික උරුමය වෙනුවට බහාලුම් භාවිතා කිරීම පුද්ගලික උරුමය තරම් පහසු නොවේ. බොහෝ විට එය කම්මැලි වීමට කම්මැලි නිදහසට කරුණකි.

protectedඋරුම ආකෘති මොනවාදැයි කිසිවෙකු දන්නේ යැයි මම නොසිතමි . අවම වශයෙන් මම තවම ඒත්තු ගැන්වෙන පැහැදිලි කිරීමක් දැක නැත.


සමහරු පවසන්නේ සම්බන්ධතාවයක් ලෙස ය. පුටුවක් මිටියක් ලෙස භාවිතා කරනවා වගේ. මෙන්න පුටුව: ආරක්ෂිත මිටිය
user4951

පුද්ගලික උරුමය වෙනුවට බහාලුම් භාවිතා කිරීම පුද්ගලික උරුමය තරම් පහසු නොවේද? කරුණාකර එය උදාහරණයක් මගින් පැහැදිලි කරන්නද?
විනාශ

Ra ප්‍රවාසි: Dපුද්ගලිකව ව්‍යුත්පන්න කර ඇත්නම් D, එය අථත්‍ය කාර්යයන් අභිබවා යා හැකිය B. (නිදසුනක් ලෙස, Bනිරීක්ෂක අතුරුමුහුණතක් නම් , සෑම කෙනෙකුම නිරීක්ෂකයෙකු ලෙස භාවිතා කිරීමට නොහැකිව, Dඑය ක්‍රියාත්මක thisකර බොහෝ අතුරු මුහුණතක් අවශ්‍ය කාර්යයන් වෙත යොමු Dකළ හැකිය.) එසේම, Dතෝරා ගැනීමෙන් Bඑහි අතුරු මුහුණතේ සාමාජිකයින් තෝරා බේරා ගත හැකිය using B::member. Bසාමාජිකයෙකු වන විට දෙකම ක්‍රියාවට නැංවීමට අපහසු වේ.
sbi

@sbi: පරණ එකක් නමුත් ... සී.ආර්.ටී.පී. එය ස්පර්ශ කිරීමට මට අවසර නැත). protectedඋරුමය virtualමූලික පංතියක් සහ protectedctor සමඟ මට ප්‍රයෝජනවත් විය :struct CommonStuff { CommonStuff(Stuff*) {/* assert !=0 */ } }; struct HandlerMixin1 : protected virtual CommonStuff { protected: HandlerMixin1() : CommonStuff(nullptr) {} /*...*/ }; struct Handler : HandlerMixin1, ... { Handler(Stuff& stuff) : CommonStuff(&stuff) {} };
lorro

11

ඔබ වෙනත් පංතියකින් ප්‍රසිද්ධියේ උරුම කර ගන්නේ නම්, ඔබ උරුම වී ඇති බව සියලු දෙනා දන්නා අතර ඔබට මූලික පන්තියේ දර්ශකයක් හරහා ඕනෑම කෙනෙකුට බහුමාමක ලෙස භාවිතා කළ හැකිය.

ඔබට ආරක්ෂිතව උරුම වුවහොත් ඔබේ දරුවන්ගේ පන්තිවලට පමණක් බහුඅවයවික වශයෙන් භාවිතා කළ හැකිය.

ඔබට පුද්ගලිකව උරුම වුවහොත් මව් පංති ක්‍රම ක්‍රියාත්මක කිරීමට ඔබට හැකි වනු ඇත.

එය මූලික වශයෙන් සංකේතවත් කරන්නේ ඔබේ මව් පන්තිය සමඟ ඔබේ සම්බන්ධතාවය පිළිබඳව සෙසු පංති සතු දැනුමයි


9

ඔබගේ පන්තියෙන් උරුම වන ඕනෑම පන්තියකට ආරක්ෂිත දත්ත සාමාජිකයින්ට ප්‍රවේශ විය හැකිය. කෙසේ වෙතත්, පුද්ගලික දත්ත සාමාජිකයින්ට නොහැක. අපට පහත සඳහන් දේ ඇති බව කියමු:

class MyClass {
    private:
        int myPrivateMember;    // lol
    protected:
        int myProtectedMember;
};

ඔබගේ දිගුවේ සිට මෙම පන්තිය දක්වා, යොමු කිරීම ක්‍රියා this.myPrivateMemberනොකරනු ඇත. කෙසේ වෙතත්, this.myProtectedMemberකැමැත්ත. වටිනාකම තවමත් අප හඳුන්වන මේ පන්තියේ හිතන්න උගන්වන්න නම්, ඒ ආවරණය කර තිබුණද ඇත myObj, එසේ නම් myObj.myProtectedMemberඒ නිසා එය පෞද්ගලික දත්ත සාමාජික කටයුතු කිරීමට සමාන වන අතර, නොවේ වැඩ කරනු ඇත.


8
Accessors    | Base Class | Derived Class | World
—————————————+————————————+———————————————+———————
public       |      y     |       y       |   y
—————————————+————————————+———————————————+———————
protected    |      y     |       y       |   n
—————————————+————————————+———————————————+———————
private      |            |               |    
  or         |      y     |       n       |   n
no accessor  |            |               |

y: accessible
n: not accessible

ජාවා සඳහා මෙම උදාහරණය මත පදනම්ව ... මම හිතන්නේ වචන දහසක් වටිනා කුඩා මේසයක් :)


ජාවා සතුව ඇත්තේ පොදු උරුමයක් පමණි
Zelldon

මෙය ජාවා ගැන කතා කළ යුතු මාතෘකාව නොවේ, නමුත් නැත, ඔබ වැරදියි ... විස්තර සඳහා ඉහත මගේ පිළිතුරේ සබැඳිය අනුගමනය කරන්න
එනිසේ

ඔබ ජාවා ගැන සඳහන් කළ නිසා එය මාතෘකාවයි. ඔබේ උදාහරණය ජැකා හි භාවිතා කරන පිරිවිතරයන් හසුරුවයි. ප්‍රශ්නය වන්නේ ජාවා හි නොපවතින උරුමය සඳහා වූ පිරිවිතරයන් වෙනසක් ඇති කිරීමයි. සුපිරි පන්තියේ ක්ෂේත්‍රයක් පොදු නම් සහ උරුමය පුද්ගලික නම් ක්ෂේත්‍රය උප පංතිය තුළ පමණක් ප්‍රවේශ විය හැකිය. උප පංතිය සුපිරි පන්තිය දිගු කරන්නේ නම් පිටතින් කිසිදු ඇඟවීමක් නොමැත. නමුත් ඔබේ වගුව පැහැදිලි කරන්නේ ක්ෂේත්‍ර සහ ක්‍රම සඳහා පිරිවිතරයන් පමණි.
Zelldon

7

සාරාංශය:

  • පුද්ගලික: පංතිය තුළ හැර වෙන කිසිවෙකුට එය දැකිය නොහැක
  • ආරක්ෂිතයි: පුද්ගලික + ව්‍යුත්පන්න පංතිවලට එය දැකිය හැකිය
  • පොදු: ලෝකයට එය දැකිය හැකිය

උරුම වන විට, ඔබට (සමහර භාෂාවලින්) දත්ත සාමාජිකයෙකුගේ ආරක්ෂණ වර්ගය යම් දිශාවකට වෙනස් කළ හැකිය, උදා: ආරක්ෂිත සිට මහජනයා දක්වා.


6

පුද්ගලික:

මූලික පන්තියක පුද්ගලික සාමාජිකයින්ට ප්‍රවේශ විය හැක්කේ එම මූලික පන්තියේ සාමාජිකයින්ට පමණි.

පොදු:

මූලික පංතියක මහජන සාමාජිකයින්ට එම පාදක පන්තියේ සාමාජිකයින්ට, එහි ව්‍යුත්පන්න පන්තියේ සාමාජිකයින්ට මෙන්ම මූලික පන්තියට පිටතින් සිටින සාමාජිකයින්ට සහ ව්‍යුත්පන්න පන්තියට ප්‍රවේශ විය හැකිය.

ආරක්ෂිත:

මූලික පංතියක ආරක්ෂිත සාමාජිකයින්ට මූලික පන්තියේ සාමාජිකයින්ට මෙන්ම එහි ව්‍යුත්පන්න පන්තියේ සාමාජිකයින්ට ප්‍රවේශ විය හැකිය.


කෙටියෙන්:

පෞද්ගලික : පදනම

ආරක්ෂිත : පාදම + ව්‍යුත්පන්න

පොදු : පදනම් + ව්‍යුත්පන්න + වෙනත් ඕනෑම සාමාජිකයෙක්


5

මට පහසු පිළිතුරක් හමු වූ අතර එය මගේ අනාගත යොමු කිරීම සඳහා ද පළ කිරීමට සිතුවෙමි.

එය http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/

class Base
{
public:
    int m_nPublic; // can be accessed by anybody
private:
    int m_nPrivate; // can only be accessed by Base member functions (but not derived classes)
protected:
    int m_nProtected; // can be accessed by Base member functions, or derived classes.
};

class Derived: public Base
{
public:
    Derived()
    {
        // Derived's access to Base members is not influenced by the type of inheritance used,
        // so the following is always true:

        m_nPublic = 1; // allowed: can access public base members from derived class
        m_nPrivate = 2; // not allowed: can not access private base members from derived class
        m_nProtected = 3; // allowed: can access protected base members from derived class
    }
};

int main()
{
    Base cBase;
    cBase.m_nPublic = 1; // allowed: can access public members from outside class
    cBase.m_nPrivate = 2; // not allowed: can not access private members from outside class
    cBase.m_nProtected = 3; // not allowed: can not access protected members from outside class
}

3

එය ව්‍යුත්පන්න පංතියේ මූලික පංතියේ මහජනතාවගේ සහ ආරක්ෂිත සාමාජිකයන්ගේ ප්‍රවේශ ආරක්ෂාවයි. පොදු උරුමය සමඟ, ව්‍යුත්පන්න පංතියට පොදු සහ ආරක්ෂිත සාමාජිකයන් කඳවුරේ දැකිය හැකිය. පුද්ගලික උරුමය සමඟ, එයට නොහැකිය. ආරක්ෂිතව, ව්‍යුත්පන්න පංතිය සහ එයින් ලබාගත් ඕනෑම පංතියක් ඒවා දැකිය හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.