派生类向基类的转换可访问性:
派生类向基类到转换是否可访问由使用该转换到代码决定,同时派生类到派生访问说明符也会有影响。假定D继承自B:
1.只有当D公有继承B时,**用户代码(其实就是对象)**才能使用派生类向基类到转换;如果D继承B的方式时受保护的或者私有的,则用户代码不能使用该转换。
(p对应的类是基类 -- d1 d2 d3 对应的类是基类的继承(继承方式如下) --
dd1 dd2 dd3对应的类d1 d2 d3的类的继承(都是public继承) )
(p d1 d2 d3 dd1 dd2 dd3都是各自类的对象)
Base *p = &d1; // d1 has type Pub_Derv from Base -- legal
p = &d2; // d2 has type Priv_Derv from Base 因为d2不是公有继承 -- illegal
p = &d3; // d3 has type Prot_Derv from Base 因为d3不是公有继承-- illegal
p = &dd1; // dd1 has type Derived_from_Public Der public form d1 -- legal
p = &dd2; // dd2 has type Derived_from_Private Der public form d2
//d2都不能转换了 -- illegal
p = &dd3; // dd3 has type Derived_from_Protected Der public form d3 -- illegal
//d3都不能转换了 -- illegal
2.不论D以什么方式继承B,D的成员函数和友员函数都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员和友员而言永远是可访问的。
class B{
};
class D:public B{
void function(D &d){
B b = d;
}
friend void friendFunction(D &d)
{
B b = d;
}
};
class E:protected B{
void function(E &e){
B b = e;
}
friend void friendFunction(E &e)
{
B b = e;
}
};
class F:private B{
void function(F &f){
B b = f;
}
friend void friendFunction(F &f)
{
B b = f;
}
};
3.如果D继承B 的方式是公有的或者受保护的,则 D的派生类的成员和友员可以使用D向B的类型转换 ;
反之,如果D继承B 的方式是私有的,则不能使用
也就是dd1和dd2对应类中成员和友员可以使用D向B的类型转换,dd3对象类的成员和友员不行