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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试从基类访问受保护的构造函数时获取错误C2248相关的知识,希望对你有一定的参考价值。

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

}

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

答案

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

struct Open_polyline : public Shape { ...
另一答案

来自this inheriting constructors reference

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

[强调我的]

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


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

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

以上是关于尝试从基类访问受保护的构造函数时获取错误C2248的主要内容,如果未能解决你的问题,请参考以下文章

绕过错误 C2248“无法访问在类中声明的受保护成员”的有效方法

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

无法从派生类构造函数参数访问受保护的基类成员[重复]

访问从基类构造函数调用的重写方法中的私有方法

为啥我会得到带有受保护静态成员的 C2248(不可访问成员)?

我无法访问我的基类的受保护成员