存取控制和靜態成員
當您指定基底類別,做為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。這個指標都是隱含型別的Derived2 *。若要選取CountOf函式, 這個必須轉換成型別Base *。因此,不允許這類轉換Base為私用的間接基底類別Derived2。私用基底類別型別轉換為只接受立即的衍生類別的指標。因此,型別的指標Derived1 *可以轉換成型別Base *。
請注意該呼叫CountOf函式,而不使用指標、 參考或物件來選取它,表示沒有轉換。因此,允許呼叫。
成員及朋友的衍生類別中, T,可將轉換為變數的指標, T的私用的直接基底類別指標的T。