有什么方法可以通过using声明来提高可见性?

时间:2019-06-26 16:16:49

标签: c++

以下代码无法编译:

class C
{
    private:

        int m_x;

    protected:

        C(int t_x) : m_x(t_x) { }

};

class D : public C
{
    public:

        using C::C;

};

int main(int argc, char **argv)
{
  D o(0);
}

编译器的反对意见是声明C的构造函数为protected,这意味着我无法从main访问它。换句话说,using声明似乎随标识符一起拖曳了标识符的原始可见性,尽管它位于public块中。

两个问题:

  1. 为什么会这样? (这两个方面都包括如何工作的规则以及制定这些规则的原理。)
  2. 有什么方法可以解决此问题而无需显式编写D的构造函数?

2 个答案:

答案 0 :(得分:12)

这是一个微妙的。在C ++中,在基类构造函数上使用using关键字称为继承构造函数,其工作原理与using关键字通常不同。具体来说,请注意

  

如果重载分辨率选择了一个继承的构造函数,则在用于构造相应基类的对象时是否可以访问它是可以访问的:引入了它的using声明的可访问性将被忽略。

(强调我的Source

换句话说,您在using部分中包含了public声明,实际上并没有使这些构造函数公开。

我相信,在这种情况下,您可能必须定义自己的构造函数以匹配基本类型的构造函数。

答案 1 :(得分:0)

使用C :: C的语句;与提高可见性无关,而是关于c ++ 11 该功能称为继承构造函数,可在构造派生D时调用基类C的构造函数。您不能以这种方式更改构造函数的访问修饰符。但是,您可以通过使用不同的访问修饰符在派生类中显式重新声明它来更改任何函数的访问修饰符。