【问题标题】:Getting error C2248 when trying to access protected constructors from a base class尝试从基类访问受保护的构造函数时出现错误 C2248
【发布时间】:2019-08-27 07:03:55
【问题描述】:

在 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" 中声明的受保护成员

我在网上阅读了关于 'using' 关键字的信息,并认为通过保护 Open_polyline 的构造函数可能会导致问题,因此我将 Open_polyline 的定义编辑为:

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

}

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

【问题讨论】:

    标签: c++ inheritance constructor protected


    【解决方案1】:

    来自this inheriting constructors reference

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

    [强调我的]

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


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

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

    【讨论】:

    • 那么,受保护的基类构造函数如何用于派生类对象的实例化?
    • "你的第二个例子应该可以正常工作,即使是私有继承。" .它给出了同样的错误。
    • @steve 它不应该给出 same 错误,而是完全不同的错误。用这个问题更新了我的答案。
    【解决方案2】:

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

    struct Open_polyline : public Shape { ...
    

    【讨论】:

      猜你喜欢
      • 2014-08-29
      • 2013-01-08
      • 2011-12-15
      • 2011-05-02
      • 1970-01-01
      • 2019-07-15
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多