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

Getting error C2248 when trying to access protected constructors from a base class

本文关键字:错误 C2248 构造函数 基类 访问 受保护      更新时间:2023-10-16

在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) {};
}

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

从这个继承构造函数引用:

如果重载解析选择了继承的构造函数,则在用于构造相应基类的对象时可访问该构造函数时,如果该构造函数可访问该构造函数,则该构造函数是可访问的

引入它的 using-声明的可访问性将被忽略

[强调我的]

对于其他成员(函数、变量(,它按照您的意图工作,但不适用于构造函数。


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

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

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

struct Open_polyline : public Shape { ...