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

问题描述 投票:0回答:2

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

}

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

c++ inheritance constructor protected
2个回答
0
投票

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

struct Open_polyline : public Shape { ...

0
投票

来自this inheriting constructors reference

如果重载决策选择了继承的构造函数,则在用于构造相应基类的对象时可以访问它是可访问的:引入它的using-declaration的可访问性将被忽略。

[强调我的]

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


第二个例子的问题是你没有Shape基类的默认构造函数。这意味着您不能默认构造Open_polyline类(因为隐式需要能够将默认构造函数作为基础Shape类)。

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

© www.soinside.com 2019 - 2024. All rights reserved.