【问题标题】:Characters and Access level of inherated constructor继承构造函数的字符和访问级别
【发布时间】:2020-07-06 01:41:38
【问题描述】:

从我所指的一本书中,我发现了类似的内容:

与使用普通成员的声明不同,构造函数使用 声明不会改变继承的访问级别 构造函数。例如,不管在哪里使用 using 声明 出现了,基中的私有构造函数是中的私有构造函数 派生的;对于受保护的和公共的构造函数也是如此。

但我发现很难理解它。谁能详细说明一下。甚至如何从基类访问私有构造函数。

【问题讨论】:

    标签: c++ class inheritance constructor


    【解决方案1】:

    给定以下代码,

    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 的可访问性是publicB::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
    

    【讨论】:

    • 表示不能从任何派生类访问私有构造函数?
    • @Dev-il 是的,这就是private 的意思;它只能由类本身或其朋友访问。
    【解决方案2】:

    如何从基类访问私有构造函数。

    不能,除非涉及到friendship。

    所以,是的,这是一个不好的例子。

    它应该与protected 一起使用以避免混淆。

    【讨论】:

      猜你喜欢
      • 2014-01-27
      • 2014-09-02
      • 1970-01-01
      • 2014-06-11
      • 2017-04-05
      • 2020-04-22
      • 2017-01-12
      • 2014-11-22
      相关资源
      最近更新 更多