尝试从基类访问受保护的构造函数时出现错误C2248

时间:2019-04-05 11:25:06

标签: c++ inheritance constructor protected

在Stroustrup的 Programming:使用C ++的原理和实践中,他具有图形库(FLTK)的包装,该库对基类具有以下定义:

class Shape  {  
protected:
Shape() { }
Shape(initializer_list<Point> lst);

//more irrelevant code below
}

还有一个派生类

struct Open_polyline : Shape {  
public:
using Shape::Shape;

//more irrelevant code here
}

当我尝试使用像这样的Open_polyline继承的构造函数时:

Open_polyline opl{ {100,100}, {150,150},{200,200},{250,250} };

我得到编译器错误C2248指出

“ Graph_lib :: Open_polyline :: Open_polyline':无法访问在类'Graph_lib :: Open_polyline中声明的受保护成员”

我在线阅读了有关'using'关键字的信息,并认为它也可能通过保护Open_polyline的构造函数而导致问题,所以我将Open_polyline的定义编辑为:

struct Open_polyline : Shape {  
public:
Open_polyline() {};
Open_polyline(initializer_list<Point> lst) : Shape(lst) {};

}

但是我仍然收到相同的错误消息。如何使用受保护的基类的构造函数?

2 个答案:

答案 0 :(得分:0)

来自this inheriting constructors reference

  

如果重载解析选择了一个继承的构造函数,则在用于构造相应基类的对象时是否可以访问它是可访问的: 引入了它的using声明的可访问性被忽略< / em>

[重点突出]

对于其他成员(函数,变量),它可以按您的意图工作,但对构造函数无效。


第二个示例的问题是您没有Shape基类的默认构造函数。这意味着您也不能默认构造Open_polyline类(因为这隐含地需要能够默认构造基Shape类)。

您可以通过向Shape类添加默认构造函数来解决此问题。或通过删除Open_polyline默认构造函数。

答案 1 :(得分:0)

您使用了私有继承。尝试写这个

struct Open_polyline : public Shape { ...