1. 只有D继承B的方式是public时,用户代码才能使用派生类向基类的转换;如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换。
2. 不论D以什么方式继承B,D的成员函数和友员函数都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员函数和友员函数来说永远是可访问的。
1 class B {}; 2 class D : private B //这里以private或者protected或者public 都可以 3 { 4 void f() 5 { 6 B * base = new D; //编译正确 7 } 8 }
如果不是成员函数(即用户代码),例如:
1 class B {}; 2 class D : private B //如果这里是public就可以,private或protected会错 3 { 4 void f() 5 { 6 B * base=new D; 7 } 8 }; 9 10 int main() 11 { 12 B * b = new D; //会出现编译错误,注意,这是用户代码 13 };
3. 如果D继承B的方式是public或者protected,则D的派生类的成员或者友员可以使用D向B的类型转换;反之,如果D继承B的方式是private,则不能使用。
1 class B {}; 2 class D : public B {}; //public或protected都可以 3 class E : private D //或者protected D 或者public D 4 { 5 void f() 6 { 7 B *b = new D; //可以编译通过 8 D *d = new E; //可以编译通过,这就是2介绍的情况。 9 } 10 };