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

43

假设以下布局:

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;
};

我是否可以在这里将Derived的构造函数指定为公共的?VC++会给出以下错误:

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

也就是说,它忽略了继承构造函数上面的访问修饰符。

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

1个回答

35
根据12.9/4的规定,“继承构造函数”,当使用using X::X时,所声明的构造函数具有与X中相应构造函数相同的访问权限。 因此,继承的构造函数也是protected

8
等等,构造函数有什么特别之处?同样的事情不适用于常规函数... - user541686
3
@Mehrdad [namespace.udecl]/18 中写道:"使用 using-declaration 创建的别名具有成员声明的通常可访问性。[ 注意:指定构造函数的 using-declaration 不会创建别名;有关相关可访问性规则,请参见 12.9。— 结束说明 ]" - TemplateRex
3
@MatthieuM。我不知道,这个提案从一开始就在草稿纸上,没有解释。而且有点讽刺的是,这个提案旨在使构造函数更像普通函数,但仍然存在这个小矛盾。 - TemplateRex
2
@MatthieuM.:所以,这个讨论的唯一提及在N1583中,它是修订N2203N2254之间引用的来源,其中进行了更改。但这不是一个实际的论点,只是需要澄清的注释。 - Kerrek SB
7
有没有人就这个问题提交了缺陷/请求意见书/其他?看起来有问题。 - underscore_d
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接