首页 > 解决方案 > 无法从派生类构造函数参数访问受保护的基类成员

问题描述

我有两个这样定义的类:

课程

class A {
    A(A& a) { ... } // deep copy
    <dtor + methods>
protected:
    A(std::shared_ptr<AImpl>& pp) : p(pp) { /* empty */ }
    std::shared_ptr<AImpl> p; // the only member variable of A
}
class B : public A {
    explicit B(const A& a) : A(a.p) { /* empty */ } // KO
    // OR
    explicit B(const A& a) { p = a.p; } // KO
    // OR
    explicit B(const A& a) : p(a.p) { /* empty */ } // obviously KO
    <members, ...>
}

注意

A(A& a)正在对 所指向的对象进行深拷贝p,这不是我需要的,因此我实现了使用共享指针本身的副本A(std::shared_ptr<AImpl>&)进行初始化以共享所有权。A::p

我不能为它定义一个setter,A::p因为AImpl它不能是公共类型,并且必须A只保留在类或其子类的范围内(接口-实现类分离设计)。

问题

我对上面提到的所有构造函数风格都有一个编译错误,说它p是不可访问的,因为它在基类中受到保护,但为什么呢?

标签: c++inheritance

解决方案


当访问被禁止时,您尝试访问A::p的不是 的基础B,而是另一个对象的基础。

您可以改为提供受保护的构造函数:

class A {
    A(A& a) { ... } // deep copy
    <dtor + methods>
protected:
    A(const A& a, int) : p(a.p) { /* empty */ }
    std::shared_ptr<AImpl> p; // the only member variable of A
};

class B : public A {
    explicit B(const A& a) : A(a,0) { /* empty */ }
    <members, ...>
};

推荐阅读