C++ 11继承构造函数和访问修饰符

Mar*_*ram 37 c++ visual-c++ c++11 inheriting-constructors

假设以下布局:

class Base
{
protected:
    Base(P1 p1, P2 p2, P3 p3);

public:
    virtual void SomeMethod() = 0;
}

class Derived : public Base
{
public:
    using Base::Base;

public:
    virtual void SomeMethod() override;
};
Run Code Online (Sandbox Code Playgroud)

我应该能够在Derived这里指定公共构造函数吗?VC++给出以下错误:

无法访问类'Derived'中声明的受保护成员
编译器已在此处生成'Derived :: Derived'[指向使用Base :: Base行]
请参阅'Derived'的声明

即它忽略了继承构造函数上方的访问修饰符.

这是该功能的限制吗?Base对于具有公共构造函数的类没有任何意义,因为它永远不能直接实例化(由于纯虚方法).

Ker*_* SB 30

根据12.9/4,"继承建设者",当说using X::X,

如此声明的构造函数具有与X中相应构造函数相同的访问权限.

所以继承的构造函数也是protected.

  • 等一下构造函数有什么特别之处?同样的事情不适用于常规功能...... (5认同)
  • @Mehrdad [namespace.udecl]/18具有:"using声明创建的别名具有成员声明的通常可访问性.[注意:命名构造函数的using声明不会创建别名;请参阅12.9相关的可访问性规则. - 结束注释]" (3认同)
  • @MatthieuM.我不知道,从一开始就一直在草案文件中,没有解释.并且具有讽刺意味的是,旨在使构造函数更加规则和普通函数的提议仍然存在这种小的不一致性. (3认同)
  • 有没有人提交过缺陷/ RFC /无论如何?这似乎不对. (3认同)
  • @MatthieuM.:所以,这次讨论的唯一提及是[N1583](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1583.pdf),这是引用之间的来源[N2203](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2203.html)和[N2254](http://www.open-std) .org/jtc1/sc22/wg21/docs/papers/2007/n2254.html),改变了这一点.但这不是一个实际的论点,只是需要澄清这一点. (2认同)
  • @MatthieuM。:是的-`using` 声明使*所有* 符合条件的基构造函数可见,而不仅仅是一个。 (2认同)