【发布时间】:2020-07-06 01:41:38
【问题描述】:
从我所指的一本书中,我发现了类似的内容:
与使用普通成员的声明不同,构造函数使用 声明不会改变继承的访问级别 构造函数。例如,不管在哪里使用 using 声明 出现了,基中的私有构造函数是中的私有构造函数 派生的;对于受保护的和公共的构造函数也是如此。
但我发现很难理解它。谁能详细说明一下。甚至如何从基类访问私有构造函数。
【问题讨论】:
标签: c++ class inheritance constructor
从我所指的一本书中,我发现了类似的内容:
与使用普通成员的声明不同,构造函数使用 声明不会改变继承的访问级别 构造函数。例如,不管在哪里使用 using 声明 出现了,基中的私有构造函数是中的私有构造函数 派生的;对于受保护的和公共的构造函数也是如此。
但我发现很难理解它。谁能详细说明一下。甚至如何从基类访问私有构造函数。
【问题讨论】:
标签: c++ class inheritance constructor
给定以下代码,
class B {
protected:
B(int) {}
};
class D : public B {
public:
using B::B;
};
然后
D d(0); // error: calling a protected constructor of class 'B'
即使using-declarationusing B::B 的可访问性是public,B::B(int) 仍然是protected 并且不可访问。如果B::B(int) 是private 也是一样,只是它也不能从派生类中访问。
(强调我的)
如果重载决议选择了一个继承的构造函数,如果它在用于构造相应基类的对象时是可访问的,则它是可访问的:引入它的 using 声明的可访问性被忽略 .
另一方面,它与其他成员不同,例如
class B {
protected:
void f(int) {}
};
class D : public B {
public:
using B::f;
};
然后
D d;
d.f(42); // fine. D::f is public
【讨论】:
private 的意思;它只能由类本身或其朋友访问。
如何从基类访问私有构造函数。
不能,除非涉及到friendship。
所以,是的,这是一个不好的例子。
它应该与protected 一起使用以避免混淆。
【讨论】: