首页 > 解决方案 > 尝试从基类访问受保护的构造函数时出现错误 C2248

问题描述

在 Stroustrup 的Programming: Principals and Practice using 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”中声明的受保护成员

我在网上阅读了有关“使用”关键字的信息,并认为通过使 Open_polyline 的构造函数也受到保护可能会导致问题,因此我将 Open_polyline 的定义编辑为:

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

}

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

标签: c++inheritanceconstructorprotected

解决方案


从此继承构造函数参考

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

[强调我的]

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


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

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


推荐阅读