簡體   English   中英

派生 class 中繼承(->“使用”)基 class 構造函數/運算符的訪問說明符是什么?

[英]What are the access specifiers of inherited (-> "using") base class ctors / operators in derived class?

在下面的代碼中,您可以看到我將基 class ctors 繼承到“私有”訪問說明符下的派生 class 中。 我最初的想法是,這些將適應我提供的訪問說明符(此處為“私有”),因此無法使用,但我似乎弄錯了。 在派生的 class 中繼承基類 class 的關於訪問說明符的構造函數和運算符的規則是什么?

演示

#include <cstdio>

class base
{
public:
    base(int i) {
        printf("Public base class ctor called!");
    }
private:
    base(bool b) {
        printf("Private base class ctor called!");
    }
};


class derived final : public base
{
private:
    using base::base;
};

int main()
{
    derived d(2);

    // issues "is private within this context"
    // derived e(true);
}

輸出:

Public base class ctor called!

(在這種情況下,預期派生的 ctor 是“私有的”)

出自 C++ 17 Standard (10.3.3 The using declaration)

19 由 using 聲明創建的同義詞具有成員聲明的通常可訪問性。 命名構造函數的 using 聲明符不會創建同義詞; 相反,如果附加構造函數在用於構造相應基數 class 的 object 時可以訪問,並且忽略 using 聲明的可訪問性,則它們是可訪問的。

因此,在您的示例中,第一個構造函數(具有int類型的參數)可在基類 class 中訪問,然后派生的 class 中相應的繼承構造函數也可訪問。

另一方面,第二個構造函數(帶有bool類型的參數)是私有的。 所以對於第二個object的定義派生class

derived e(true);

編譯器將發出錯誤。

事實上繼承的構造函數也繼承了訪問控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM