以下代码没有编译:
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
编写构造函数来解决这个问题?发布于 2019-06-26 08:24:13
这是个微妙的问题。在C++中,在基类构造函数上使用using
关键字称为继承构造函数,其工作方式与using
关键字通常所做的不同。具体来说,请注意
如果重载解析选择了继承的构造函数,那么如果它在构造相应基类的对象时是可访问的,则它是可访问的:引入它的using-声明的可访问性被忽略。
(强调我的。来源)
换句话说,您已经将using
声明包含在public
部分中这一事实实际上并没有使这些构造函数公开。
我认为,在这种情况下,您可能必须定义自己的构造函数来匹配基类型构造函数。
发布于 2019-06-26 08:42:35
语句使用C::C;不是增加可见性,而是因为c++11特性称为继承构造函数,在构造派生D时使基类C的构造函数调用。您不能以这种方式更改构造函数的访问修饰符。但是,可以通过使用不同的访问修饰符在派生类中显式地重新声明任何函数来更改任何函数的访问修饰符。
https://stackoverflow.com/questions/56777176
复制