无法从派生类构造函数参数访问受保护的基类成员[重复]
Posted
技术标签:
【中文标题】无法从派生类构造函数参数访问受保护的基类成员[重复]【英文标题】:Protected base class member not accessible from derived class constructor parameter [duplicate] 【发布时间】:2019-08-01 09:45:00 【问题描述】:我有两个这样定义的类:
类
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
共享所有权。
我无法为A::p
定义setter,因为AImpl
不能是公共类型,并且必须保持在A
类或其子类的范围内(接口-实现类分离设计)。
问题:
上面提到的所有构造函数风格都有一个编译错误,说 p
不可访问,因为它在基类中受到保护,但为什么呢?
【问题讨论】:
A(a.p)
?你想让A::p
从自身初始化?
【参考方案1】:
当访问被禁止时,您尝试访问的不是B
的基类A::p
,而是另一个对象。
您可以改为提供受保护的构造函数:
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, ...>
;
【讨论】:
我的Live Demo on coliru 的想法非常相似...以上是关于无法从派生类构造函数参数访问受保护的基类成员[重复]的主要内容,如果未能解决你的问题,请参考以下文章