返回信息流在《C++ Primer》中文第四版的489页,有这样一段话:
1.如果是public继承,则用户代码和后代类都可以使用派生类到基类的转换。
2.如果类是使用private或者protected继承派生的,则用户代码不能将派生类对象转换为基类对象。
3.如果是private继承,则从private继承类派生的类不能转换为基类。
4.如果是protected继承,则后续派生类的成员可以转换为基类类型。
5.无论是什么派生访问标号,派生类本身都可以访问基类的public成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。
class A{};
class B:protected A
{
public:
void f1(const A& a){}
void f2(){const A& a=*this;}
};
B b;
b.f1(b);//这个报错:A是B不可访问的基类;
b.f2();//这个通过;
参考上面的第5条,按说上面两种情况应该都属于派生类本身成员,为什么f1的调用出错?难道是因为实参b转换为const A&的过程也属于“用户代码”的范畴,也就是上面的第2条?
这是一条镜像帖。来源:北邮人论坛 / cpp / #73306同步于 2013/8/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]《C++ Primer》中派生类到基类转换的可访问性
nocefly
2013/8/22镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
如果是
B b1,b2;
b1.f1(b2);//不通过
就好理解了吧。
b.f1(b)对编译器来说和b1.f1(b2)没什么区别的,只是恰好调用函数的对象和传递的参数一样。
iPhone客户端1.3发布
【 在 shuicaibxx 的大作中提到: 】
: 如果是
: B b1,b2;
: b1.f1(b2);//不通过
: ...................
谢谢。我的意思其实是想问,参数传递过程(也就是b或者b2对象转换为const A&的过程)是不是并不属于成员函数f1的范畴,因为如果属于,参照第5条是可以编译通过的,所以只有函数体里面的部分可以实现派生类到基类的转换(像f2调用所示);