البيانات المحمية في الفئة الأصل غير متوفرة في فئة الأطفال؟

StackOverflow https://stackoverflow.com/questions/1414506

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا في حيرة: اعتقدت البيانات المحمية وقراءة / للكتابة من قبل الأطفال من فئة معينة في C ++

والمتكررة أدناه فشل تجميع في MS مترجم

class A
{
protected:
  int data;
};

class B : public A
{
  public:

  B(A &a)
  {
    data = a.data;
  }
};

int main()
{
  A a;
  B b = a;
  return 0;
}

وظهور رسالة خطأ:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

demoFail.cpp
demoFail.cpp(12) : error C2248: 'A::data' : cannot access protected member declared in class 'A'
        demoFail.cpp(4) : see declaration of 'A::data'
        demoFail.cpp(2) : see declaration of 'A'

وماذا أفعل الخطأ؟

هل كانت مفيدة؟

المحلول

ووفقا لTC ++ PL، ص 404:

<اقتباس فقرة>   

وهناك فئة مشتقة يمكن الوصول إلى الفئة الأساسية "باي أعضاء فقط لكائنات من نوع خاص به .... وهذا ما يمنع الأخطاء الطفيفة التي يمكن أن تحدث إلا عندما تعود بيانات واحدة مستمدة تفسد الطبقة إلى الفئات المشتقة الأخرى.

وبطبيعة الحال، وهنا طريقة سهلة لإصلاح هذه لقضيتك:

class A
{
protected:
    int data;
};

class B : public A
{
public:
    B(const A &a)
        : A(a)
    {
    }
};

int main()
{
    A a;
    B b = a;
    return 0;
}

نصائح أخرى

وو++ C ستاندرد يقول عن أعضاء غير ثابت محمية في 11.5/1

<اقتباس فقرة>   

عند أحد الأصدقاء أو دالة عضو من فئة مشتقة مراجع دالة عضو nonstatic محمية أو محمية عضو بيانات nonstatic من الفئة الأساسية، ينطبق على الاختيار وصول بالإضافة إلى تلك التي وصفها في الفقرة 11. في وقت سابق إلا عند تشكيل مؤشر إلى عضو (5.3.1)، يجب أن يكون الوصول من خلال مؤشر، إشارة إلى، أو كائن من فئة مشتقة نفسه (أو أي فئة مشتقة من تلك الفئة) (5.2.5). إذا كان الوصول هو تشكيل مؤشر إلى عضو، يقوم متداخلة اسم-اسم محدد فئة مشتقة (أو أي فئة مشتقة من تلك الفئة).

وبالإضافة إلى تحديد الأشياء المذكورة في وقت سابق من قبل الآخرين (منشئ B هو الخاص)، وأعتقد أن الطريقة rlbond نفعل ذلك على ما يرام. ومع ذلك، كنتيجة مباشرة لأحكام الفقرة السابقة من المعيار هو أن يلي من الممكن استخدام مؤشر الأعضاء، التي يمكن القول ثقب في نظام نوع، وبطبيعة الحال

class B : public A {
public:
  B(A &a){
    int A::*dataptr = &B::data;
    data = a.*dataptr;
  }
};

وبطبيعة الحال، لا ينصح هذا الرمز إلى القيام به، ولكن يظهر أنك <م> يمكن الوصول إليه، إذا كنت حقا بحاجة الى (رأيت هذه الطريقة تستخدم لطباعة وstd::stack، std::queue ، std::priority_queue عن طريق الوصول إلى محمية c عضو الحاوية الخاصة به)

وأنت فقط <م> لا ينبغي أن نسخ كائن A في منشئ B. والقصد من ذلك هو ترك تهيئة أعضاء A لهو نفسه المنشئ:

struct A { 
  A( const A& a ): data( a.data ) {}
  protected: int data; 
};

struct B : public A {
  B( const A& a ): A( a ) {}
};

ومنشئ من B هو الخاص. إذا لم تقم بتحديد أي شيء، في فئة، المعدل الافتراضي الخاص (لالبنيات هو العام). حتى في هذا المثال المشكلة هي أنه لا يمكن بناء B. عند إضافة الجمهور إلى منشئ B anoter المشكلة تنشأ:

B لها الحق في تعديل جزء من A هو مستمد من ولكن ليس هناك مثل آخر في هذه القضية.

هل يمكن أن تفعل ما يلي:

class A
{
public:
  A()
      : data(0)
  {
  }
  A(A &a)
  {
    data = a.data;
  }
protected:
  int data;
};

class B : public A
{
public:
  B(A &a)
      : A(a)
  {
  }
};

int main()
{
  A a;
  B b = a;
  return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top