父类中的受保护数据在子类中不可用?

Pau*_*han 11 c++ protected

我很困惑:我认为受保护的数据是由C++中给定类的子进程读/写的.

以下代码段无法在MS Compiler中编译

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;
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

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'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

rlb*_*ond 10

根据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;
}
Run Code Online (Sandbox Code Playgroud)