ব্যক্তিগত, পাবলিক এবং সুরক্ষিত উত্তরাধিকারের মধ্যে পার্থক্য


1012

মধ্যে পার্থক্য কি public, privateএবং protectedমধ্যে উত্তরাধিকার সি ++?

এসও-তে আমি যে সমস্ত প্রশ্ন পেয়েছি তা সুনির্দিষ্ট কেসগুলির সাথে ডিল করে।

উত্তর:


1064

এই প্রশ্নের উত্তর দিতে, আমি নিজের কথায় প্রথমে সদস্যের অ্যাকসেসরগুলি বর্ণনা করতে চাই। আপনি যদি ইতিমধ্যে এটি জানেন তবে "পরবর্তী:" শিরোনামটি এড়িয়ে যান।

তিনটি 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সচেতন নয়।

182
আমি কয়েকটি শব্দ যুক্ত করতে চাই যে সি ++ তে দৃশ্যমানতা অবজেক্টের পরিবর্তে ক্লাসের উপর ভিত্তি করে, যার অর্থ একই শ্রেণীর অবজেক্টগুলি বিনা বাধা ছাড়াই একে অপরের ব্যক্তিগত ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারে।
heে চেন

48
আপনার যদি এটি বুঝতে সমস্যা হয় তবে কিরিল ভি লিয়াডভিনস্কির উত্তরটি পড়ুন, তবে ফিরে এসে এটি পড়ুন।
ভিভানডিয়ের

6
এটি কেবলমাত্র একটি অন্য ঘটনা যা চিত্রিত করে যে বেশিরভাগ অংশের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া SomeBaseযেমন একটি অনামী সদস্যকে লেখার জন্য একটি হার্ডকোডযুক্ত পদ্ধতির মতো SomeBase। অন্য যে কোনও সদস্যের মতো এটিরও একটি অ্যাক্সেস স্পেসিফায়ার রয়েছে, যা বাহ্যিক অ্যাক্সেসে একই নিয়ন্ত্রণ ব্যবহার করে।
আন্ডারস্কোর_ডি

1
@ চেচেন যদি আমার কাছে ব্যক্তিগত ক্ষেত্রের বয়সের ক্লাস পার্সনের টম এবং জেরির অবজেক্ট থাকে তবে আপনি কীভাবে টম ব্যবহার করে জেরির বয়স অ্যাক্সেস করবেন (এবং সংশোধন?)?
জেন

2
"" উত্তরাধিকার সম্পর্কে সচেতন "দ্বারা আপনি কী বোঝাতে চেয়েছেন তা বোঝাতে পারেন? আমি বুঝতে পারি "আমি এটি অ্যাক্সেস করতে পারি আমি এটি অ্যাক্সেস করতে পারি না" তবে যখন কেউ বলে "আমি জানি যে বি থেকে উত্তরাধিকার সূত্রে জানা যায়" আমি এখানে কী করছি আমি উত্তরাধিকার যাচাই করছি?
neilxdims

1458
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 এর ভেরিয়েবল রয়েছে। এটি কেবল অ্যাক্সেসের প্রশ্ন।

সুরক্ষিত এবং ব্যক্তিগত উত্তরাধিকার ব্যবহার সম্পর্কে আপনি এখানে পড়তে পারেন ।


35
আনজুরিও যা লিখেছেন তা কেবল নীচে আপনার উত্তরের সাথে মিল রেখে ক্লিক করেছে। Плус 1.
আইওলনোটেক্সিস্ট আইডোনোটেক্সবাদ

2
এটি কীভাবে কাজ করেছিল তা সম্পর্কে আমার বোঝা এতদূর বন্ধ ছিল! পরিষ্কার করার জন্য আপনাকে অনেক ধন্যবাদ।
tjwrona1992

এটি বুঝতে আমার কিছুটা সময় লেগেছিল। তবে এখন এটা পরিষ্কার। ধন্যবাদ!
চান কিম

115

উত্তরাধিকারের দৃশ্যমানতা সীমাবদ্ধ করা কোডটি দেখতে সক্ষম হবে না যে কোনও শ্রেণি অন্য শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত: বেস থেকে প্রাপ্ত ভিত্তি থেকে অন্তর্নিহিত রূপান্তরগুলি কাজ করবে না, এবং static_castবেস থেকে প্রাপ্ত অংশে কোনও কাজ করবে না।

কেবলমাত্র কোনও শ্রেণীর সদস্য / বন্ধুরা ব্যক্তিগত উত্তরাধিকার দেখতে পাবে এবং কেবল সদস্য / বন্ধু এবং উত্সর্গীকৃত ক্লাসগুলি সুরক্ষিত উত্তরাধিকার দেখতে পাবে।

সর্বজনীন উত্তরাধিকার

  1. আইএস-এ উত্তরাধিকার। একটি উইন্ডো হ'ল একটি উইন্ডো এবং যেখানেই যেখানে উইন্ডো প্রয়োজন সেখানে একটি বোতামও পাস করা যেতে পারে।

    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. Accessors

    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
আমি মনে করি স্কট মাইয়ার্স (যতটা তার জিনিস পছন্দ করি) সাধারণ বিভ্রান্তির জন্য অনেক উত্তর দিতে পারে। আমি এখন মনে করি যে এটি চলছে তার জন্য আইএস-এ এবং ইস-ইমপ্লিমেন্টড-ইন-টার্মস-অফ এর উপমাগুলি যথেষ্ট।
ডেনজারমাউস

65

এই তিনটি কীওয়ার্ড দৃশ্যমানতার উত্তরাধিকারের মডেলটি নির্দিষ্ট করতে সম্পূর্ণ ভিন্ন প্রসঙ্গে ব্যবহৃত হয় ।

এই টেবিলটি সাবক্লাসটি সম্পূর্ণরূপে সংজ্ঞায়িত হয়ে গেলে উপাদানগুলির ফলাফলের অ্যাক্সেস উপস্থাপনকারী উপাদান ঘোষণা এবং উত্তরাধিকারের মডেলের সমস্ত সম্ভাব্য সংমিশ্রণগুলি সংগ্রহ করে।

এখানে চিত্র বর্ণনা লিখুন

উপরের সারণিটি নিম্নলিখিত উপায়ে ব্যাখ্যা করা হয়েছে (প্রথম সারিতে একবার দেখুন):

একটি উপাদান ঘোষিত যেমন প্রকাশ্য এবং তার ক্লাস হয় উত্তরাধিকারসূত্রে যেমন প্রকাশ্য ফলে এক্সেস হয় প্রকাশ্য

একটি উদাহরণ:

 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শ্রেণিটি ক্লাস থেকে প্রাপ্ত SuperSubনতুন ভেরিয়েবলের কিংবা নতুন ফাংশন তন্ন তন্ন শ্রেণী প্রবর্তন করে। এর অর্থ কি এই যে 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

4
প্রথমত কোনও সংশোধকের অভাব উল্লেখ করার জন্য (শ্রেণিতে যেমন: সুপারক্লাস) ফলন প্রাইভেট। এটি সম্পূর্ণরূপে ব্যাখ্যার পাশাপাশি অন্যরা নিখোঁজ হওয়া একটি গুরুত্বপূর্ণ অংশ। +1
জল

2
ওভারকিল আইএমও, তবে আমি শুরুতে টেবিলটি পছন্দ করি।
সিপি.ইএনজিআর

63

বেস ক্লাসের পাবলিক সদস্যরা কীভাবে উদ্ভূত শ্রেণি থেকে প্রকাশিত হবে তা নিয়ে এটি করা দরকার।

  • সর্বজনীন -> বেস শ্রেণীর পাবলিক সদস্যরা সর্বজনীন হবে (সাধারণত ডিফল্ট)
  • সুরক্ষিত -> বেস শ্রেণীর পাবলিক সদস্যরা সুরক্ষিত থাকবে
  • বেসরকারী -> বেস শ্রেণীর পাবলিক সদস্যরা ব্যক্তিগত হবে

যেমন লিটব উল্লেখ করেছেন, সর্বজনীন উত্তরাধিকার হ'ল traditionalতিহ্যগত উত্তরাধিকার যা আপনি বেশিরভাগ প্রোগ্রামিং ভাষায় দেখতে পাবেন। এটি এটি একটি "আইএস-এ" সম্পর্কের মডেল। বেসরকারী উত্তরাধিকার, সিএফ + এর কাছে আফাকের বিচিত্র কিছু, এটি একটি "সম্পর্কের শর্তাবলী"। এটি হ'ল আপনি উদ্ভূত শ্রেণিতে পাবলিক ইন্টারফেসটি ব্যবহার করতে চান তবে উত্সযুক্ত শ্রেণীর ব্যবহারকারীর সেই ইন্টারফেসটিতে অ্যাক্সেস থাকতে চান না। অনেকের যুক্তি রয়েছে যে এক্ষেত্রে আপনার বেস ক্লাসটি একত্রিত করা উচিত, এটি বেস বেস হিসাবে বেস ক্লাস হওয়ার পরিবর্তে বেস ক্লাসের কার্যকারিতা পুনরায় ব্যবহার করার জন্য উত্পন্ন সদস্যকে তৈরি করা উচিত।


13
আরও ভাল "জনসাধারণ: উত্তরাধিকারটি প্রত্যেকে দেখবে"। সুরক্ষিত: উত্তরাধিকার কেবল উত্পন্ন ক্লাস এবং বন্ধুদের দ্বারা দেখা যাবে "," ব্যক্তিগত: উত্তরাধিকার কেবল শ্রেণি নিজে এবং বন্ধুরা দেখবে "। এটি আপনার কথার থেকে পৃথক, যেহেতু কেবল সদস্য অদৃশ্যই হতে পারে না, তবে এটিও আইএস-এ সম্পর্ক অদৃশ্য হতে পারে
জোহানেস স্কাউব - লিটব

4
একসময় আমি ব্যক্তিগত উত্তরাধিকারটি ব্যবহার করেছি ডগ টি বর্ণিত ঠিক তেমনটি করা যা "আপনি উদ্ভূত শ্রেণিতে পাবলিক ইন্টারফেসটি ব্যবহার করতে চান, তবে চান না যে উত্সযুক্ত শ্রেণীর ব্যবহারকারীর সেই ইন্টারফেসে অ্যাক্সেস রয়েছে"। আমি মূলত এটি পুরানো ইন্টারফেসটি সিল করতে এবং উত্পন্ন শ্রেণীর মাধ্যমে আরও একটি প্রকাশ করার জন্য ব্যবহার করেছি।
ধনী

36
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

সর্বজনীন উত্তরাধিকার মডেল একটি আইএস-এ সম্পর্ক 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়প্রত্যয়ী ব্যাখ্যা দেখিনি।


কেউ বলে একটি সম্পর্ক হিসাবে। হাতুড়ি হিসাবে চেয়ার ব্যবহার করার মতো। এখানে চেয়ার: সুরক্ষিত হাতুড়ি
user4951

ব্যক্তিগত উত্তরাধিকারের পরিবর্তে পাত্রে ব্যবহার করার সময় ব্যক্তিগত উত্তরাধিকারের মতো সুবিধাজনক নয়? আপনি দয়া করে একটি উদাহরণ ব্যবহার করে ব্যাখ্যা করবেন?
ধ্বংসকারী

@ প্রবাসী: যদি 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) {} };
লোরো

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

জাভা জন্য এই উদাহরণের উপর ভিত্তি করে ... আমি মনে করি হাজার টাকার একটি সামান্য টেবিল :)


জাভাতে কেবল সর্বজনীন উত্তরাধিকার রয়েছে
জেলডন

এটি জাভা সম্পর্কে কথা বলার বিষয় নয় তবে কোনও কথা নয়, আপনি ভুল ... বিশদ বিবরণের জন্য উপরের আমার উত্তরের লিঙ্কটি অনুসরণ করুন
এনিসে

আপনি জাভা উল্লেখ করেছেন তাই এটি বিষয়। এবং আপনার উদাহরণটি স্পষ্টকারীদের পরিচালনা করে যা জ্যাকায় ব্যবহৃত হয়। প্রশ্ন উত্তরাধিকারের নির্দিষ্টকরণকারীদের সম্পর্কে যা জাভাতে বিদ্যমান নয় এবং এটি একটি পার্থক্য করেছে। সুপারক্লাসের কোনও ক্ষেত্র যদি সর্বজনীন হয় এবং উত্তরাধিকারটি ব্যক্তিগত হয় তবে ক্ষেত্রটি কেবল সাবক্লাসের অভ্যন্তরে প্রবেশযোগ্য। সাবক্লাস সুপারক্লাস প্রসারিত হলে বাইরে কোনও ইঙ্গিত নেই। তবে আপনার টেবিলটি ক্ষেত্র এবং পদ্ধতিগুলির জন্য কেবল নির্দিষ্টকারীদের ব্যাখ্যা করে।
জেলডন

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

এটি মূলত উদ্ভূত শ্রেণীর বেস শ্রেণীর পাবলিক এবং সুরক্ষিত সদস্যদের অ্যাক্সেস সুরক্ষা। জনসাধারণের উত্তরাধিকারের সাথে, উত্পন্ন শ্রেণিটি বেসের সর্বজনীন এবং সুরক্ষিত সদস্যদের দেখতে পাবে। ব্যক্তিগত উত্তরাধিকার সহ, এটি পারে না। সুরক্ষিত, উদ্ভূত শ্রেণি এবং এর থেকে প্রাপ্ত যে কোনও শ্রেণি সেগুলি দেখতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.