无法从派生类构造函数参数访问受保护的基类成员[重复]

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&amp; a) 正在对p 指向的对象进行深层复制,这不是我需要的,所以我实现了A(std::shared_ptr&lt;AImpl&gt;&amp;) 以使用共享指针本身的副本初始化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 的想法非常相似...

以上是关于无法从派生类构造函数参数访问受保护的基类成员[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我无法访问我的基类的受保护成员

protectedpublicprivate

C# 中base和this关键字

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

如何影响派生类中受保护的基变量

访问派生类中的受保护成员