派生类向基类转换是否可访问是由使用该转换的代码决定,同时派生类的派生访问说明符也会有影响 , 假定 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 ; // 错误
}
};