以下代码无法编译:
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
块中。
两个问题:
D
的构造函数?答案 0 :(得分:12)
这是一个微妙的。在C ++中,在基类构造函数上使用using
关键字称为继承构造函数,其工作原理与using
关键字通常不同。具体来说,请注意
如果重载分辨率选择了一个继承的构造函数,则在用于构造相应基类的对象时是否可以访问它是可以访问的:引入了它的using声明的可访问性将被忽略。
(强调我的Source)
换句话说,您在using
部分中包含了public
声明,实际上并没有使这些构造函数公开。
我相信,在这种情况下,您可能必须定义自己的构造函数以匹配基本类型的构造函数。
答案 1 :(得分:0)
使用C :: C的语句;与提高可见性无关,而是关于c ++ 11 该功能称为继承构造函数,可在构造派生D时调用基类C的构造函数。您不能以这种方式更改构造函数的访问修饰符。但是,您可以通过使用不同的访问修饰符在派生类中显式重新声明它来更改任何函数的访问修饰符。