在Stroustrup的编程:使用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) {};
}
但我仍然得到相同的错误消息。我如何使用受保护的基类的构造函数?
你使用了私有继承。试着写这个
struct Open_polyline : public Shape { ...
来自this inheriting constructors reference:
如果重载决策选择了继承的构造函数,则在用于构造相应基类的对象时可以访问它是可访问的:引入它的using-declaration的可访问性将被忽略。
[强调我的]
对于其他成员(函数,变量),它按您的意图工作,但不适用于构造函数。
第二个例子的问题是你没有Shape
基类的默认构造函数。这意味着您不能默认构造Open_polyline
类(因为隐式需要能够将默认构造函数作为基础Shape
类)。
您可以通过向Shape
类添加默认构造函数来解决此问题。或者通过删除Open_polyline
默认构造函数。