【问题标题】:C++11 inheriting constructors and access modifiersC++11 继承构造函数和访问修饰符
【发布时间】:2014-01-27 17:59:04
【问题描述】:

假设如下布局:

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' [指向使用 Base::Base 线]
请参阅“派生”的声明

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

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

【问题讨论】:

    标签: c++ visual-c++ c++11 inheriting-constructors


    【解决方案1】:

    根据 12.9/4,“继承构造函数”,当说 using X::X

    这样声明的构造函数与 X 中相应的构造函数具有相同的访问权限。

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

    【讨论】:

    • 等等构造函数有什么特别之处?同样的事情不适用于常规功能...
    • @Mehrdad [namespace.udecl]/18 有:“使用声明创建的别名具有成员声明的通常可访问性。[注意:命名构造函数的使用声明确实不创建别名;有关相关的可访问性规则,请参见 12.9。- end note ]"
    • @MatthieuM。我不知道,从一开始就在草稿中,没有解释。确实有点讽刺的是,一个旨在让构造函数更正常的提案。普通的功能,还是会留下这个小不一致的地方。
    • @MatthieuM.:因此,此讨论的唯一提及是在 N1583 中,这是修订版 N2203N2254 之间的引用来源,其中已更改。但这不是一个实际的论点,只是需要说明这一点。
    • 有没有人提交过缺陷/RFC/关于这个的任何东西?好像错了。
    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 2015-10-20
    • 2016-01-29
    • 2017-08-17
    • 1970-01-01
    • 2013-12-24
    • 2013-05-21
    相关资源
    最近更新 更多