为什么继承的受保护构造函数不能公开?
Why can't an inherited protected constructor be made public?
考虑:
class A
{
protected:
A(int) {}
void f(int) {}
public:
A() {}
};
class B : public A
{
public:
using A::A;
using A::f;
};
int main()
{
B().f(1); // ok
B(1); // error: 'A::A(int)' is protected within this context
}
为什么继承的protected
构造函数不能public
,而继承的protected
成员函数可以?
与其他成员不同,引入继承构造函数的 using-声明的可访问性将被忽略。
[namespace.udecl]/19,
(强调我的(
由 using- 声明创建的同义词具有成员声明的通常可访问性。命名构造函数的using 声明器不会创建同义词;相反,如果其他构造函数在用于构造相应基类的对象时可访问,则其他构造函数是可访问的,并且USING-声明的可访问性将被忽略。
实际上,继承的构造函数可以公开,但不仅仅是你编写它的方式。您可以按如下方式定义B
类:
class B : public A {
public:
B() {}
B(int x) : A(x) {} // instead of using A::A(int)
using A::f;
};
(见GodBolt(
也许标准委员会认为说using A::A
会有点模棱两可,因为基类的构造函数与子类的构造函数并不完全相同。
相关文章:
- C++:考虑但不调用构造函数的特殊性
- 不命名构造函数和析构函数上的类型错误
- 为什么不递增?(构造函数)
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- TypeError: [c++ addon class] 不是构造函数
- 应用于运算符而不是构造函数的显式关键字
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 错误:表达式不能用作函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 运行 std::线程不在构造函数中
- 如果在C++中不需要构造函数或析构函数,是否有必要显式声明它?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 在转换中使用函子(带/不带构造函数)
- 将构造对象但不是构造函数的方法
- 为什么此参数包不能接受函数指针?
- 使用 -pedantic 编译时采用 std::reference_wrapper 的不明确构造函数
- 为什么不能订购函数参数评估
- 搜索 ID 不能用作函数错误
- C++变量可以在构造函数中访问,但不能在函数中访问