在派生类的构造函数的初始化中无法访问受保护的函数

时间:2019-08-23 17:02:48

标签: c++ inheritance constructor initialization protected

我正在尝试实现直接从类Union继承的类ShapeUnion是由多个形状组成的形状)。

Shape的(受保护的)构造函数以Point作为输入(代表形状的中心)。要构造Union对象,唯一的输入是形状列表(const vector<const Shape>)。为了实现Union的构造函数,我想使用一个初始化列表,如下所述

class Union : Shape
{
public:
     Union(const std::vector<const Shape> shapes): 
     Shape(shapes[0].get_center()), shapes(shapes) {};
     ...
private:
     const std::vector<const Shape> shapes;

}

具有get_center()的类Shape的受保护虚拟函数。

class Shape
{
protected:
     Shape (const Point& center) : center(center) {};
     virtual const Point& get_center() const =0;
     ...
private:
     const Point center;
}

但是,当我在get_center()构造函数的初始化列表中调用Union时,出现一个错误,指出“ get_center()是Shape的受保护成员”。

有人可以解释一下为什么我不能从子类get_center()(应该继承了该函数)中调用Union吗?

谢谢!

P.S .:如果我将函数get_center()设置为public,就不会再有错误了。

1 个答案:

答案 0 :(得分:2)

问题可以简化为

struct Base
{
protected:
    int i = 0;
};

struct Derived : Base
{
    static void foo(Base& b)
    {
        b.i = 42; // Error
    }

    static void bar(Derived& d)
    {
        d.i = 42; // Ok
    }
};

Demo

您只能通过派生类访问受保护的成员。