继承公共/受保护/私有构造函数
Posted
技术标签:
【中文标题】继承公共/受保护/私有构造函数【英文标题】:Inheriting public/protected/private constructors 【发布时间】:2019-08-24 21:41:09 【问题描述】:如果我理解正确:
class Base /*...*/ ;
class Derived: public Base public: using Base::Base;
将强制继承Derived
中的所有Base
构造函数。
但是公共/受保护/私有构造函数呢?
class Base
friend void g();
public:
Base (A a);
protected:
Base (B b);
private:
Base (C c);
;
class Derived: public Base
public:
using Derived::Derived;
;
我找不到任何关于此的规范,但我尝试了以下方法:
void f ()
DerivedA; // OK
DerivedB; // Inaccessible
DerivedC; // Inaccessible
void g ()
DerivedA; // OK
DerivedB; // OK
DerivedC; // OK
看来,using Base::Base
在决定继承哪些构造函数(它继承私有构造函数)时没有考虑访问修饰符,但它使用这些修饰符继承它们(私有/受保护的构造函数仍然无法访问其他人)并且它允许对Base
的朋友进行私有/受保护的访问(友谊不是继承的,因此g
不是Derived
的朋友,但它仍然可以访问从Base
继承的Derived
的私有/受保护构造函数)。
这是正确和标准的行为吗?
【问题讨论】:
【参考方案1】:您正在寻找的规范在 [namespace.udecl] ¶19,强调我的。
命名构造函数的using-declarator不会创建同义词; 相反,如果附加构造函数在用于构造相应基类的对象时可访问,则它们是可访问的 类,using-declaration的可访问性被忽略。
您的测试与该段落一致。可访问性检查失败或通过,就像在您检查的范围内构造 Base
时一样。
【讨论】:
以上是关于继承公共/受保护/私有构造函数的主要内容,如果未能解决你的问题,请参考以下文章