无法在派生类中访问基类的受保护成员

21 c++ protected access-control

我有以下代码:

struct A {
protected:
    A() {}

    A* a;
};

struct B : A {
protected:
    B() { b.a = &b; }

    A b;
};
Run Code Online (Sandbox Code Playgroud)

奇怪的是它没有编译.罪魁祸首是b.a = &b;任务:GCC和clang都抱怨A()受到保护,这不应该是一个问题,因为B继承A.我进入标准的哪个黑暗角落?

Dav*_*eas 21

意思protected是派生类型可以访问自己基础的成员而不是任何随机对象*.在你的情况下,你关心尝试修改b你的控制之外的成员(即你可以设置this->a,但不能b.a)

如果你感兴趣,有一个hack可以让它工作,但更好的解决方案是重构代码而不依赖于hacks.例如,你可以提供一个构造函数,A它接受一个A*as参数(这个构造函数应该是public),然后在初始化列表中初始化它B:

A::A( A* p ) : a(p) {}
B::B() : b(&b) {}
Run Code Online (Sandbox Code Playgroud)

* protected授予您在您自己类型的任何实例中访问基本成员或从您自己的类型派生的权限.