c++ - 尝试从基类访问受保护的构造函数时出现错误 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) {};
}
但我仍然收到相同的错误消息。如何使用受保护基类的构造函数?
解决方案
从此继承构造函数参考:
如果重载决议选择了一个继承的构造函数,如果它在用于构造相应基类的对象时是可访问的,则它是可访问的:引入它的 using 声明的可访问性被忽略。
[强调我的]
对于其他成员(函数、变量),它按您的意图工作,但不适用于构造函数。
第二个示例的问题是您没有Shape
基类的默认构造函数。这意味着您也不能默认构造Open_polyline
该类(因为这隐含地需要能够默认构造基Shape
类)。
您可以通过向类添加默认构造函数来解决此问题Shape
。或者通过删除Open_polyline
默认构造函数。
推荐阅读
- java - 如何在 Hibernate 5 中从 xml 创建表?
- kendo-ui - Kendo UI 自定义 Kendo 确认 OK 按钮
- laravel - 用户注销时如何删除所有刷新令牌?另外,如果他们忘记注销并且下次登录并注销?
- php - 拖尾 html 文本(使用 PHP)
- textmate - 如何在 TextMate(C 包)中禁用自动缩进?
- mongodb - MongoDB 3.6 版本的性能问题
- javascript - 如何对齐具有不同列数的两行
- react-native - 字体的 react-native 链接 - 仅链接字体
- python-3.x - Anaconda Navigator 1.9.7 - 环境 - 更新索引错误 - Ubuntu 16.04 LTS
- c# - 有没有办法在更新旋转时使相机围绕游戏对象运行?