存取控制和靜態成員
當您將基底類別指定為 private 時,只會影響到非靜態成員。 在衍生類別中仍然可以存取公用的靜態成員。 不過,使用指標、參考或物件存取基底類別的成員可能需要進行轉換,此時會重新套用存取控制。 參考下列範例:
// access_control.cpp
class Base
{
public:
int Print(); // Nonstatic member.
static int CountOf(); // Static member.
};
// Derived1 declares Base as a private base class.
class Derived1 : private Base
{
};
// Derived2 declares Derived1 as a public base class.
class Derived2 : public Derived1
{
int ShowCount(); // Nonstatic member.
};
// Define ShowCount function for Derived2.
int Derived2::ShowCount()
{
// Call static member function CountOf explicitly.
int cCount = Base::CountOf(); // OK.
// Call static member function CountOf using pointer.
cCount = this->CountOf(); // C2247. Conversion of
// Derived2 * to Base * not
// permitted.
return cCount;
}
在上述程式碼中,存取控制項禁止從 Derived2 的指標轉換為 Base 的指標。 this 指標可以隱含轉換為 Derived2 * 類型。 若要選取 CountOf 函式,必須將 this 轉換為 Base * 類型。 由於 Base 是 Derived2 的私用間接基底類別,因此不允許進行這類轉換。 只有直接衍生類別的指標可以轉換為私用的基底類別類型。 因此,Derived1 * 類型的指標可以轉換成 Base * 類型。
請注意,明確呼叫 CountOf 函式,而不使用指標、參考或物件加以選取,表示沒有進行轉換。 因此,可以進行呼叫。
衍生類別的成員和 friend (即 T) 可以將 T 的指標轉換為 T 的私用直接基底類別的指標。