c++ - 派生类构造函数参数无法访问 protected 基类成员

标签 c++ inheritance

<分区>

我有两个这样定义的类:

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不能是公共(public)类型并且必须保留在类 A 的范围内或其子类(接口(interface)-实现类分离设计)。

问题:

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

最佳答案

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

您可以改为提供 protected 构造函数:

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, ...>
};

关于c++ - 派生类构造函数参数无法访问 protected 基类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57306220/

相关文章:

delphi - 如何从具有 protected 数据类型的类继承?

C++/菱形继承(钻石问题)/静态变量

java - 这段代码是在不创建新类的情况下实例化或扩展抽象类吗?

c++ - 定义类的成员函数时包含参数会返回错误

c++ - 为什么项目依赖会影响链接器设置

c++ - G++ 添加包含和链接路径

Java - 扩展一个类的类,并且具有一个扩展另一个类的组件的组件

c++ - C++ 中的同步 unordered_map

c++ - 可变参数函数中可变参数模板类的隐式转换

python - 为什么我的 python 子类无法识别父类(super class)的属性?