在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) {};
}
但是我仍然收到相同的错误消息。如何使用受保护的基类的构造函数?
答案 0 :(得分:0)
来自this inheriting constructors reference:
如果重载解析选择了一个继承的构造函数,则在用于构造相应基类的对象时是否可以访问它是可访问的: 引入了它的using声明的可访问性被忽略< / em> 。
[重点突出]
对于其他成员(函数,变量),它可以按您的意图工作,但对构造函数无效。
第二个示例的问题是您没有Shape
基类的默认构造函数。这意味着您也不能默认构造Open_polyline
类(因为这隐含地需要能够默认构造基Shape
类)。
您可以通过向Shape
类添加默认构造函数来解决此问题。或通过删除Open_polyline
默认构造函数。
答案 1 :(得分:0)
您使用了私有继承。尝试写这个
struct Open_polyline : public Shape { ...