අතර ඇති වෙනස කුමක්ද
public
,private
හාprotected
උරුමයක් C ++?
SO හි මා සොයාගත් සියලුම ප්රශ්න විශේෂිත අවස්ථා සමඟ කටයුතු කරයි.
අතර ඇති වෙනස කුමක්ද
public
,private
හාprotected
උරුමයක් C ++?
SO හි මා සොයාගත් සියලුම ප්රශ්න විශේෂිත අවස්ථා සමඟ කටයුතු කරයි.
Answers:
එම ප්රශ්නයට පිළිතුරු සැපයීම සඳහා, සාමාජිකයන්ගේ ප්රවේශයන් පළමුව මගේ වචන වලින් විස්තර කිරීමට මම කැමතියි. ඔබ මෙය දැනටමත් දන්නේ නම්, "ඊළඟ:" යන මාතෘකාවට යන්න.
මම ගැන දන්නවා ඇති accessors තුනක් ඇත: public
, protected
සහ private
.
ඉඩ:
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
Base
බව ද දනී .Base
publicMember
Base
අඩංගු protectedMember
.Base
දැනුවත් නැත privateMember
."දැනුවත්ව" යන්නෙන්, මම අදහස් කළේ "පැවැත්ම පිළිගෙන ඒ අනුව ප්රවේශ විය හැකි" යන්නයි.
රාජ්ය, පෞද්ගලික සහ ආරක්ෂිත උරුමය සම්බන්ධයෙන් ද එය එසේම වේ. උරුම වන පන්තියක් Base
සහ පන්තියක් සලකා බලමු .Child
Base
public
, දන්නා සෑම දෙයක්ම Base
හා Child
ද වන බව දන්නා Child
අනුන සිට Base
.protected
, Child
සහ එහි දරුවන් පමණක් , ඔවුන් උරුම වන බව දැන සිටිති Base
.private
වෙන කිසිවෙකු දන්නේ නැත Child
.SomeBase
නිර්නාමික වර්ගයේ සාමාජිකයෙකු රචනා කිරීම සඳහා දැඩි කේත ක්රමයක් ලෙසට SomeBase
. මෙය වෙනත් ඕනෑම සාමාජිකයෙකුට මෙන් ප්රවේශ ප්රවේශයක් ඇත, එය බාහිර ප්රවේශය මත එකම පාලනයක් ක්රියාත්මක කරයි.
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 යන විචල්යයන් අඩංගු වේ. එය ප්රවේශය පිළිබඳ ප්රශ්නයකි.
ආරක්ෂිත සහ පෞද්ගලික උරුමය භාවිතා කිරීම පිළිබඳව ඔබට මෙහි කියවිය හැකිය .
උරුමයේ දෘශ්යතාව සීමා කිරීම මඟින් යම් පන්තියකට වෙනත් පන්තියක් උරුම වන බව කේතයට නොපෙනේ: ව්යුත්පන්නයේ සිට පාදම දක්වා ව්යංග පරිවර්තනයන් ක්රියා නොකරනු static_cast
ඇති අතර පාදමේ සිට ව්යුත්පන්න දක්වා ක්රියා නොකරනු ඇත.
පුද්ගලික උරුමය දැකිය හැක්කේ පන්තියක සාමාජිකයින්ට / මිතුරන්ට පමණක් වන අතර ආරක්ෂිත උරුමය දැකිය හැක්කේ සාමාජිකයින්ට / මිතුරන්ට සහ ව්යුත්පන්න පංතිවලට පමණි.
පොදු උරුමය
IS-A උරුමයක්. බොත්තමක් යනු කවුළුවක් වන අතර කවුළුවක් අවශ්ය ඕනෑම තැනක බොත්තමක් ද සම්මත කළ හැකිය.
class button : public window { };
ආරක්ෂිත උරුමය
ආරක්ෂිතව ක්රියාත්මක කරන ලද-අනුව. කලාතුරකින් ප්රයෝජනවත් වේ. භාවිතා 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!
}
};
පෞද්ගලික උරුමය
ක්රියාත්මක කිරීම. මූලික පන්තියේ භාවිතය ව්යුත්පන්න පන්තිය ක්රියාත්මක කිරීම සඳහා පමණි. ගති ලක්ෂණ සමඟ ප්රයෝජනවත් වන අතර ප්රමාණය වැදගත් නම් (කාර්යයන් පමණක් අඩංගු හිස් ගති ලක්ෂණ හිස් පාදක පන්ති ප්රශස්තිකරණය භාවිතා කරයි). බොහෝ විට පාලනය කිරීම වඩා හොඳ විසඳුම වේ. නූල් සඳහා ප්රමාණය ඉතා වැදගත් වේ, එබැවින් එය මෙහි බොහෝ විට දක්නට ලැබෙන භාවිතයකි
template<typename StorageModel>
struct string : private StorageModel {
public:
void realloc() {
// uses inherited function
StorageModel::realloc();
}
};
මහජන සාමාජිකයෙක්
සමස්ථ
class pair {
public:
First first;
Second second;
};
ප්රවේශයන්
class window {
public:
int getWidth() const;
};
ආරක්ෂිත සාමාජිකයා
ව්යුත්පන්න පංති සඳහා වැඩි දියුණු කළ ප්රවේශයක් සැපයීම
class stack {
protected:
vector<element> c;
};
class window {
protected:
void registerClass(window_descriptor w);
};
පෞද්ගලික සාමාජිකයෙක්
ක්රියාත්මක කිරීමේ තොරතුරු තබා ගන්න
class window {
private:
int width;
};
සී-ස්ටයිල් කැස්ට් විසින් ව්යුත්පන්න කරන ලද පංතියක් ආරක්ෂිත හෝ පෞද්ගලික පාදක පන්තියකට නිර්වචනය කර ආරක්ෂිත ආකාරයකින් වාත්තු කිරීමට ඉඩ දෙන අතර අනෙක් දිශාවට ද දමන්න. මෙය සෑම වියදමකින්ම වළක්වා ගත යුතුය, මන්ද එය ක්රියාත්මක කිරීමේ තොරතුරු මත කේතය රඳා පැවතිය හැකි බැවිනි - නමුත් අවශ්ය නම් ඔබට මෙම තාක්ෂණය භාවිතා කළ හැකිය.
දෘශ්යතා උරුම ආකෘතිය නියම කිරීම සඳහා මෙම වචන තුන මුළුමනින්ම වෙනස් සන්දර්භයක භාවිතා වේ .
මෙම පංතිය උප පංතිය මුළුමනින්ම නිර්වචනය කර ඇති විට එහි ප්රති 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
එය පදනම් පංතියේ මහජන සාමාජිකයින් ව්යුත්පන්න පන්තියෙන් නිරාවරණය වන ආකාරය සමඟ සම්බන්ධ වේ.
ලිට්බ් පෙන්වා දෙන පරිදි, පොදු උරුමය යනු බොහෝ ක්රමලේඛන භාෂාවලින් ඔබ දකින සාම්ප්රදායික උරුමයකි. එය "IS-A" සම්බන්ධතාවයක් නිරූපණය කරයි. පුද්ගලික උරුමය, C ++ ට විශේෂිත වූ AFAIK යනු “නියමයන් තුළ ක්රියාත්මක” සම්බන්ධතාවයකි. ව්යුත්පන්න පන්තියේ පොදු අතුරුමුහුණත භාවිතා කිරීමට ඔබට අවශ්යය , නමුත් ව්යුත්පන්න පන්තියේ පරිශීලකයාට එම අතුරු මුහුණතට ප්රවේශය අවශ්ය නොවේ. බොහෝ අය තර්ක කරන්නේ මෙම අවස්ථාවේදී ඔබ මූලික පන්තිය එකතු කළ යුතු බවයි, එනම් මූලික පන්තිය පුද්ගලික පදනමක් ලෙස තබා ගැනීම වෙනුවට, පදනම් පන්තියේ ක්රියාකාරිත්වය නැවත භාවිතා කිරීම සඳහා ව්යුත්පන්න කළ සාමාජිකයෙකු බවට පත් කරන්න.
Member in base class : Private Protected Public
උරුමය වර්ගය : වස්තුව උරුම වී ඇත්තේ :
Private : Inaccessible Private Private
Protected : Inaccessible Protected Protected
Public : Inaccessible Protected Public
1) මහජන උරුමය :
ඒ. මූලික පන්තියේ පෞද්ගලික සාමාජිකයින්ට ව්යුත්පන්න පන්තියට ප්රවේශ විය නොහැක.
බී. ව්යුත්පන්න පංතියේ මූලික පංතියේ ආරක්ෂිත සාමාජිකයන් ආරක්ෂා කර ඇත.
ඇ. මූලික පන්තියේ මහජන සාමාජිකයන් ව්යුත්පන්න පන්තියේ ප්රසිද්ධියේ සිටිති.
එබැවින්, වෙනත් පංතිවලට ව්යුත්පන්න පංති වස්තුව හරහා මූලික පන්තියේ මහජන සාමාජිකයින් භාවිතා කළ හැකිය.
2) ආරක්ෂිත උරුමය :
ඒ. මූලික පන්තියේ පෞද්ගලික සාමාජිකයින්ට ව්යුත්පන්න පන්තියට ප්රවේශ විය නොහැක.
බී. ව්යුත්පන්න පංතියේ මූලික පංතියේ ආරක්ෂිත සාමාජිකයන් ආරක්ෂා කර ඇත.
ඇ. මූලික පංතියේ මහජන සාමාජිකයන් ද ව්යුත්පන්න පන්තියේ ආරක්ෂිත සාමාජිකයන් බවට පත්වේ.
එබැවින්, වෙනත් පංතිවලට ව්යුත්පන්න පන්ති වස්තුව හරහා මූලික පන්තියේ මහජන සාමාජිකයින් භාවිතා කළ නොහැක; නමුත් ඒවා ව්යුත්පන්න උප කාණ්ඩයට ලබා ගත හැකිය.
3) පුද්ගලික උරුමය :
ඒ. මූලික පන්තියේ පෞද්ගලික සාමාජිකයින්ට ව්යුත්පන්න පන්තියට ප්රවේශ විය නොහැක.
බී. මූලික පංතියේ ආරක්ෂිත සහ මහජන සාමාජිකයන් ව්යුත්පන්න පන්තියේ පෞද්ගලික සාමාජිකයන් බවට පත්වේ.
එබැවින්, ව්යුත්පන්න පන්තියේ කිසිදු සාමාජිකයෙකුට වෙනත් පන්ති වලට ව්යුත්පන්න පංති වස්තුව හරහා ප්රවේශ විය නොහැක. එබැවින්, ව්යුත්පන්න පන්තියේ උප පංතියට පවා ඒවාට ප්රවේශ විය නොහැක.
මහජන උරුමය 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
උරුම ආකෘති මොනවාදැයි කිසිවෙකු දන්නේ යැයි මම නොසිතමි . අවම වශයෙන් මම තවම ඒත්තු ගැන්වෙන පැහැදිලි කිරීමක් දැක නැත.
D
පුද්ගලිකව ව්යුත්පන්න කර ඇත්නම් D
, එය අථත්ය කාර්යයන් අභිබවා යා හැකිය B
. (නිදසුනක් ලෙස, B
නිරීක්ෂක අතුරුමුහුණතක් නම් , සෑම කෙනෙකුම නිරීක්ෂකයෙකු ලෙස භාවිතා කිරීමට නොහැකිව, D
එය ක්රියාත්මක this
කර බොහෝ අතුරු මුහුණතක් අවශ්ය කාර්යයන් වෙත යොමු D
කළ හැකිය.) එසේම, D
තෝරා ගැනීමෙන් B
එහි අතුරු මුහුණතේ සාමාජිකයින් තෝරා බේරා ගත හැකිය using B::member
. B
සාමාජිකයෙකු වන විට දෙකම ක්රියාවට නැංවීමට අපහසු වේ.
protected
උරුමය virtual
මූලික පංතියක් සහ protected
ctor සමඟ මට ප්රයෝජනවත් විය :struct CommonStuff { CommonStuff(Stuff*) {/* assert !=0 */ } }; struct HandlerMixin1 : protected virtual CommonStuff { protected: HandlerMixin1() : CommonStuff(nullptr) {} /*...*/ }; struct Handler : HandlerMixin1, ... { Handler(Stuff& stuff) : CommonStuff(&stuff) {} };
ඔබ වෙනත් පංතියකින් ප්රසිද්ධියේ උරුම කර ගන්නේ නම්, ඔබ උරුම වී ඇති බව සියලු දෙනා දන්නා අතර ඔබට මූලික පන්තියේ දර්ශකයක් හරහා ඕනෑම කෙනෙකුට බහුමාමක ලෙස භාවිතා කළ හැකිය.
ඔබට ආරක්ෂිතව උරුම වුවහොත් ඔබේ දරුවන්ගේ පන්තිවලට පමණක් බහුඅවයවික වශයෙන් භාවිතා කළ හැකිය.
ඔබට පුද්ගලිකව උරුම වුවහොත් මව් පංති ක්රම ක්රියාත්මක කිරීමට ඔබට හැකි වනු ඇත.
එය මූලික වශයෙන් සංකේතවත් කරන්නේ ඔබේ මව් පන්තිය සමඟ ඔබේ සම්බන්ධතාවය පිළිබඳව සෙසු පංති සතු දැනුමයි
ඔබගේ පන්තියෙන් උරුම වන ඕනෑම පන්තියකට ආරක්ෂිත දත්ත සාමාජිකයින්ට ප්රවේශ විය හැකිය. කෙසේ වෙතත්, පුද්ගලික දත්ත සාමාජිකයින්ට නොහැක. අපට පහත සඳහන් දේ ඇති බව කියමු:
class MyClass {
private:
int myPrivateMember; // lol
protected:
int myProtectedMember;
};
ඔබගේ දිගුවේ සිට මෙම පන්තිය දක්වා, යොමු කිරීම ක්රියා this.myPrivateMember
නොකරනු ඇත. කෙසේ වෙතත්, this.myProtectedMember
කැමැත්ත. වටිනාකම තවමත් අප හඳුන්වන මේ පන්තියේ හිතන්න උගන්වන්න නම්, ඒ ආවරණය කර තිබුණද ඇත myObj
, එසේ නම් myObj.myProtectedMember
ඒ නිසා එය පෞද්ගලික දත්ත සාමාජික කටයුතු කිරීමට සමාන වන අතර, නොවේ වැඩ කරනු ඇත.
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
ජාවා සඳහා මෙම උදාහරණය මත පදනම්ව ... මම හිතන්නේ වචන දහසක් වටිනා කුඩා මේසයක් :)
සාරාංශය:
උරුම වන විට, ඔබට (සමහර භාෂාවලින්) දත්ත සාමාජිකයෙකුගේ ආරක්ෂණ වර්ගය යම් දිශාවකට වෙනස් කළ හැකිය, උදා: ආරක්ෂිත සිට මහජනයා දක්වා.
මූලික පන්තියක පුද්ගලික සාමාජිකයින්ට ප්රවේශ විය හැක්කේ එම මූලික පන්තියේ සාමාජිකයින්ට පමණි.
මූලික පංතියක මහජන සාමාජිකයින්ට එම පාදක පන්තියේ සාමාජිකයින්ට, එහි ව්යුත්පන්න පන්තියේ සාමාජිකයින්ට මෙන්ම මූලික පන්තියට පිටතින් සිටින සාමාජිකයින්ට සහ ව්යුත්පන්න පන්තියට ප්රවේශ විය හැකිය.
මූලික පංතියක ආරක්ෂිත සාමාජිකයින්ට මූලික පන්තියේ සාමාජිකයින්ට මෙන්ම එහි ව්යුත්පන්න පන්තියේ සාමාජිකයින්ට ප්රවේශ විය හැකිය.
පෞද්ගලික : පදනම
ආරක්ෂිත : පාදම + ව්යුත්පන්න
පොදු : පදනම් + ව්යුත්පන්න + වෙනත් ඕනෑම සාමාජිකයෙක්
මට පහසු පිළිතුරක් හමු වූ අතර එය මගේ අනාගත යොමු කිරීම සඳහා ද පළ කිරීමට සිතුවෙමි.
එය 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
}
එය ව්යුත්පන්න පංතියේ මූලික පංතියේ මහජනතාවගේ සහ ආරක්ෂිත සාමාජිකයන්ගේ ප්රවේශ ආරක්ෂාවයි. පොදු උරුමය සමඟ, ව්යුත්පන්න පංතියට පොදු සහ ආරක්ෂිත සාමාජිකයන් කඳවුරේ දැකිය හැකිය. පුද්ගලික උරුමය සමඟ, එයට නොහැකිය. ආරක්ෂිතව, ව්යුත්පන්න පංතිය සහ එයින් ලබාගත් ඕනෑම පංතියක් ඒවා දැකිය හැකිය.