মধ্যে পার্থক্য কি
public
,private
এবংprotected
মধ্যে উত্তরাধিকার সি ++?
এসও-তে আমি যে সমস্ত প্রশ্ন পেয়েছি তা সুনির্দিষ্ট কেসগুলির সাথে ডিল করে।
মধ্যে পার্থক্য কি
public
,private
এবংprotected
মধ্যে উত্তরাধিকার সি ++?
এসও-তে আমি যে সমস্ত প্রশ্ন পেয়েছি তা সুনির্দিষ্ট কেসগুলির সাথে ডিল করে।
উত্তর:
এই প্রশ্নের উত্তর দিতে, আমি নিজের কথায় প্রথমে সদস্যের অ্যাকসেসরগুলি বর্ণনা করতে চাই। আপনি যদি ইতিমধ্যে এটি জানেন তবে "পরবর্তী:" শিরোনামটি এড়িয়ে যান।
তিনটি 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
বেস থেকে প্রাপ্ত অংশে কোনও কাজ করবে না।
কেবলমাত্র কোনও শ্রেণীর সদস্য / বন্ধুরা ব্যক্তিগত উত্তরাধিকার দেখতে পাবে এবং কেবল সদস্য / বন্ধু এবং উত্সর্গীকৃত ক্লাসগুলি সুরক্ষিত উত্তরাধিকার দেখতে পাবে।
সর্বজনীন উত্তরাধিকার
আইএস-এ উত্তরাধিকার। একটি উইন্ডো হ'ল একটি উইন্ডো এবং যেখানেই যেখানে উইন্ডো প্রয়োজন সেখানে একটি বোতামও পাস করা যেতে পারে।
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;
};
Accessors
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;
};
নোট করুন যে সি-স্টাইলের কাস্টগুলি উদ্দেশ্যমূলকভাবে একটি সংজ্ঞায়িত এবং নিরাপদ উপায়ে একটি সুরক্ষিত বা বেসরকারী বেস শ্রেণিতে উত্পন্ন শ্রেণিটিকে কাস্টিং এবং অন্য দিকেও কাস্ট করার অনুমতি দেয়। এটি কোনও মূল্যে এড়ানো উচিত, কারণ এটি প্রয়োগের বিশদগুলির উপর কোড নির্ভর করে - তবে প্রয়োজনে আপনি এই কৌশলটি ব্যবহার করতে পারেন।
এই তিনটি কীওয়ার্ড দৃশ্যমানতার উত্তরাধিকারের মডেলটি নির্দিষ্ট করতে সম্পূর্ণ ভিন্ন প্রসঙ্গে ব্যবহৃত হয় ।
এই টেবিলটি সাবক্লাসটি সম্পূর্ণরূপে সংজ্ঞায়িত হয়ে গেলে উপাদানগুলির ফলাফলের অ্যাক্সেস উপস্থাপনকারী উপাদান ঘোষণা এবং উত্তরাধিকারের মডেলের সমস্ত সম্ভাব্য সংমিশ্রণগুলি সংগ্রহ করে।
উপরের সারণিটি নিম্নলিখিত উপায়ে ব্যাখ্যা করা হয়েছে (প্রথম সারিতে একবার দেখুন):
একটি উপাদান ঘোষিত যেমন প্রকাশ্য এবং তার ক্লাস হয় উত্তরাধিকারসূত্রে যেমন প্রকাশ্য ফলে এক্সেস হয় প্রকাশ্য ।
একটি উদাহরণ:
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 {};
ভেরিয়েবলের জন্য ফলে এক্সেস 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
পদ্ধতিগুলি অ্যাক্সেসযোগ্য। কেন?
যখন আমরা ভিজিবিলিটি স্পেসিফায়ার বাদ দিই, সংকলক ধরে নেয় যে আমরা তথাকথিত ব্যক্তিগত উত্তরাধিকার প্রয়োগ করতে যাচ্ছি । এর অর্থ হ'ল সমস্ত পাবলিক সুপারক্লাস উপাদানগুলি ব্যক্তিগত অ্যাক্সেসে পরিণত হয় , ব্যক্তিগত সুপারক্লাস উপাদানগুলি মোটেই অ্যাক্সেসযোগ্য হবে না। ফলস্বরূপ এর অর্থ হ'ল আপনাকে সাবক্লাসের অভ্যন্তরবর্তীটি ব্যবহার করার অনুমতি নেই।
আমাদের পূর্বে ব্যবহৃত অ্যাক্সেস নীতি সংরক্ষণ করতে চাই এমন সংকলককে আমাদের অবহিত করতে হবে।
class Sub : public Super { };
বিভ্রান্ত করবেন না : এর অর্থ এই নয় যে সুপার ক্লাসের ব্যক্তিগত উপাদানগুলি (স্টোরেজ ভেরিয়েবলের মতো) কিছুটা যাদুতে জনসাধারণে পরিণত হবে into ব্যক্তিগত উপাদান থাকবে ব্যক্তিগত , প্রকাশ্য থাকবে প্রকাশ্য ।
Sub
ক্লাসের অবজেক্টগুলি ক্লাস থেকে তাদের বড় ভাইবোনের মতো একই কাজ "প্রায়" করতে পারে Super
। "প্রায়" কারণ একটি সাবক্লাস হওয়ার সত্যতাটিও বোঝায় যে ক্লাসটি সুপারক্লাসের ব্যক্তিগত উপাদানগুলির অ্যাক্সেস হারিয়েছে । আমরা Sub
ক্লাসের কোনও সদস্য ফাংশন লিখতে পারি না যা স্টোরেজ ভেরিয়েবলটি সরাসরি পরিচালনা করতে সক্ষম হবে।
এটি একটি অত্যন্ত গুরুতর বাধা। কোন workaround আছে?
হ্যাঁ ।
তৃতীয় অ্যাক্সেস স্তরটিকে সুরক্ষিত বলা হয় । সুরক্ষিত কীওয়ার্ডটির অর্থ হ'ল এর সাথে চিহ্নিত উপাদানটি কোনও সাবক্লাসের দ্বারা ব্যবহৃত হয় যখন এটি সর্বজনীনতার মতো আচরণ করে এবং পৃথিবীর অন্যান্য অংশে ব্যক্তিগত হিসাবে দেখায় । - এটি কেবল সর্বজনীন উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসগুলির জন্য সত্য (আমাদের উদাহরণে সুপার বর্গের মতো) -
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
বেস ক্লাসের পাবলিক সদস্যরা কীভাবে উদ্ভূত শ্রেণি থেকে প্রকাশিত হবে তা নিয়ে এটি করা দরকার।
যেমন লিটব উল্লেখ করেছেন, সর্বজনীন উত্তরাধিকার হ'ল traditionalতিহ্যগত উত্তরাধিকার যা আপনি বেশিরভাগ প্রোগ্রামিং ভাষায় দেখতে পাবেন। এটি এটি একটি "আইএস-এ" সম্পর্কের মডেল। বেসরকারী উত্তরাধিকার, সিএফ + এর কাছে আফাকের বিচিত্র কিছু, এটি একটি "সম্পর্কের শর্তাবলী"। এটি হ'ল আপনি উদ্ভূত শ্রেণিতে পাবলিক ইন্টারফেসটি ব্যবহার করতে চান তবে উত্সযুক্ত শ্রেণীর ব্যবহারকারীর সেই ইন্টারফেসটিতে অ্যাক্সেস থাকতে চান না। অনেকের যুক্তি রয়েছে যে এক্ষেত্রে আপনার বেস ক্লাসটি একত্রিত করা উচিত, এটি বেস বেস হিসাবে বেস ক্লাস হওয়ার পরিবর্তে বেস ক্লাসের কার্যকারিতা পুনরায় ব্যবহার করার জন্য উত্পন্ন সদস্যকে তৈরি করা উচিত।
Member in base class : Private Protected Public
উত্তরাধিকারের ধরণ : অবজেক্টটি উত্তরাধিকার সূত্রে প্রাপ্ত :
Private : Inaccessible Private Private
Protected : Inaccessible Protected Protected
Public : Inaccessible Protected Public
1) সরকারী উত্তরাধিকার :
ক। বেস ক্লাসের ব্যক্তিগত সদস্যরা ডেরাইভড ক্লাসে প্রবেশযোগ্য নয়।
খ। বেস ক্লাসের সুরক্ষিত সদস্যরা ডেরাইভড ক্লাসে সুরক্ষিত থাকে।
গ। বেস ক্লাসের পাবলিক সদস্যরা ডেরাইভড ক্লাসে সর্বজনীন থাকেন।
সুতরাং, অন্যান্য শ্রেণিগুলি ডেরাইভড ক্লাস অবজেক্টের মাধ্যমে বেস শ্রেণির পাবলিক সদস্যদের ব্যবহার করতে পারে।
2) সুরক্ষিত উত্তরাধিকার :
ক। বেস ক্লাসের ব্যক্তিগত সদস্যরা ডেরাইভড ক্লাসে প্রবেশযোগ্য নয়।
খ। বেস ক্লাসের সুরক্ষিত সদস্যরা ডেরাইভড ক্লাসে সুরক্ষিত থাকে।
গ। বেস ক্লাসের পাবলিক সদস্যরাও ডেরাইভড ক্লাসের সুরক্ষিত সদস্য হয়ে যায়।
সুতরাং, অন্যান্য শ্রেণিগুলি উত্পন্ন শ্রেণীর অবজেক্টের মাধ্যমে বেস শ্রেণির পাবলিক সদস্য ব্যবহার করতে পারে না; তবে সেগুলি ডেরাইভের সাবক্লাসে উপলব্ধ।
3) ব্যক্তিগত উত্তরাধিকার :
ক। বেস ক্লাসের ব্যক্তিগত সদস্যরা ডেরাইভড ক্লাসে প্রবেশযোগ্য নয়।
খ। বেস ক্লাসের সুরক্ষিত ও পাবলিক সদস্যরা ডেরাইভড ক্লাসের প্রাইভেট সদস্য হন।
সুতরাং, বেস ক্লাসের কোনও সদস্য ডেরাইভড ক্লাসে প্রাইভেট হওয়ায় ডেরাইভড ক্লাস অবজেক্টের মাধ্যমে অন্যান্য শ্রেণি দ্বারা প্রবেশ করা যায় না। সুতরাং, উত্সযুক্ত শ্রেণীর এমনকি সাবক্লাসগুলি এগুলি অ্যাক্সেস করতে পারে না।
সর্বজনীন উত্তরাধিকার মডেল একটি আইএস-এ সম্পর্ক relationship সঙ্গে
class B {};
class D : public B {};
প্রতিটি D
হয় B
।
ব্যক্তিগত উত্তরাধিকারের মডেলগুলি একটি IS- কার্যকর-ব্যবহার সম্পর্ক (বা যা বলা হয়)। সঙ্গে
class B {};
class D : private B {};
একটি D
হল না একটি B
, কিন্তু প্রতি D
তার ব্যবহার B
তার বাস্তবায়ন হবে। পরিবর্তে নিয়মিত ব্যবহার করে ব্যক্তিগত উত্তরাধিকার সর্বদা নির্মূল করা যায়:
class B {};
class D {
private:
B b_;
};
এই D
, খুব, ব্যবহার করে বাস্তবায়ন করা যাবে B
তার ব্যবহার করে, এই ক্ষেত্রে b_
। উত্তরাধিকারের চেয়ে ধারণাগুলি প্রকারের মধ্যে কম শক্ত সংযুক্তি, তাই সাধারণভাবে এটি পছন্দ করা উচিত। কখনও কখনও ব্যক্তিগত উত্তরাধিকারের পরিবর্তে পাত্রে ব্যবহার করা ব্যক্তিগত উত্তরাধিকারের মতো সুবিধাজনক নয়। অলস হওয়ার জন্য প্রায়শই এটি একটি খোঁড়া অজুহাত।
আমার মনে হয় না যে protected
উত্তরাধিকারের মডেলগুলি কেউ জানে । কমপক্ষে আমি এখনও কোনও দৃinc়প্রত্যয়ী ব্যাখ্যা দেখিনি।
D
ব্যক্তিগতভাবে থেকে নেওয়া হয় তবে D
এটি ভার্চুয়াল ফাংশনগুলিকে ওভাররাইড করতে পারে B
। (উদাহরণস্বরূপ, B
যদি একটি পর্যবেক্ষক ইন্টারফেস হয়, তবে D
এটি প্রয়োগ করতে পারে এবং this
প্রত্যক্ষদর্শী D
হিসাবে ব্যবহার করতে সক্ষম না হয়ে, ইন্টারফেসের জন্য প্রয়োজনীয় ফাংশনগুলি পাস করতে পারে )) এছাড়াও, D
নির্বাচিতভাবে B
তার ইন্টারফেসে সদস্যদের উপস্থাপন করতে পারে using B::member
। উভয়ই B
সদস্য থাকাকালীন কার্যকর করতে অসুবিধে হয়।
protected
উত্তরাধিকার আমি একটি virtual
বেস ক্লাস এবং protected
কর্টারের সাথে দরকারী পেয়েছি: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
}
এটি মূলত উদ্ভূত শ্রেণীর বেস শ্রেণীর পাবলিক এবং সুরক্ষিত সদস্যদের অ্যাক্সেস সুরক্ষা। জনসাধারণের উত্তরাধিকারের সাথে, উত্পন্ন শ্রেণিটি বেসের সর্বজনীন এবং সুরক্ষিত সদস্যদের দেখতে পাবে। ব্যক্তিগত উত্তরাধিকার সহ, এটি পারে না। সুরক্ষিত, উদ্ভূত শ্রেণি এবং এর থেকে প্রাপ্ত যে কোনও শ্রেণি সেগুলি দেখতে পারে।