派生類向基類轉換是否可通路是由使用該轉換的代碼決定,同時派生類的派生通路說明符也會有影響 , 假定 D 繼承B:
1:隻有當D公有繼承B時,使用者代碼才能使用派生類向基類的轉換;如果D繼承B的方式是受保護的或者私有的,則使用者代碼不能使用該轉換。
class B{};
class D: public B{};
int main(){
D d ;
B &b = d ; //正确
return 0 ;
}
class B{};
class D: protected B{};
class D1 : private B{} ;
int main(){
D d ;
D1 d1 ;
B &b = d ; // 錯誤
B &b1 = d1 ; //錯誤
return 0 ;
}
2: 無論D以什麼方式繼承B,D的成員和友元都能使用派生類向基類的轉換;派生類向其直接基類的類型轉換對于派生類的成員和友元來說永遠是可通路的。
class B{}; class D1 : protected B{
class D: protected B{ friend void ff() ;
public : public :
void f(){ void f1(){
D d ; D1 d1 ;
B &b = d; //正确 B &b1 = d1 ;//正确
} }
}; };
void ff() { class D2 : private B{
D1 d1 ; public :
B &b1 = d1 ; //正确 void f2(){
} D2 d2 ;
B &b2 = d2 ;//正确
}
};
3:如果D繼承B的方式是公有或者受保護的,則D的派生類的成員和友元可以使用D向B的類型轉換;反之,如果D繼承B的方式是私有的,則不能使用。
class B{};
class D: private B{ };
class DD : public D{
void fd(){
D dd ;
B &bb = dd ; // 錯誤
}
};