[英]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.