派生类转换到基类的可访问性

jxcyly1985 2009-09-14 03:37:26
1.如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。

2.如果类是使用 private 或 protected 继承派生的,则用户代码不能将派生类型对象转换为基类对象。

3.如果是 private 继承,则从 private 继承类派生的类不能转换为基类。

4.如果是 protected 继承,则后续派生类的成员可以转换为基类类型。

无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。

对于1,我能明白,
对于2,我觉得是因为private,protected继承过来,基类的public也成为派生类的protected,private,所以不能转换
对于3,继承类派生的类不能转换为基类,我没有明白,什么是说类不能转换成基类,这个和对象的转换有什么区别?
对于4,后续派生类的成员可以转换为基类类型,这个也没有明白什么意思,派生类自己也能转为成基类是吗?

...全文
478 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
haibocui 2012-10-17
  • 打赏
  • 举报
回复
派生类转换为基类只是形式上的转换,而派生类中的基类部分的访问权限不变。比如派生类是private继承,则基类中的public成员在派生类中就变成了private成员。这样的话由于转换并不改变派生类中的基类部分的访问权限,所以转换之后用户代码访问不了,这个派生类之后再次派生的类也访问不了。
同样的,若是protected集成,则基类中的public成员在派生类中就变成了protected成员。派生类转换到基类,这些成员仍是protected成员,用户代码肯定访问不了,但这个派生类之后再次派生的类可以访问(其实是可以访问也可能访问不了,关键是看是用public派生还是protected派生,还是private派生)。
关键是理解转换只是形式上的转换即可,访问权限没变,数据没变,这样其他的问题用以前学过的就能解决了(就是些在哪可以访问,在哪不可以访问的问题)。
cphj 2009-09-15
  • 打赏
  • 举报
回复
实证检验全部正确

连同第5点
5. 无论是什么派生访问标号,派生类本身都可以访问基类的 public 成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。


class c00
{
private:
int c00a;
};

class c10 : public c00
{
private:
int c10a;
public:
void f(const c00 & c) //1 ok
{
}
};

class c11 : protected c00
{
private:
int c11a;
public:
void f(const c00 & c) //5 ok
{
}
};

class c12 : private c00
{
private:
int c12a;
public:
void f(const c00 & c) //5 ok
{
}
};

class c21 : public c11
{
private:
int c21a;
public:
void f(const c00 & c) //4 ok
{
}
};

class c22 : public c12
{
private:
int c22a;
public:
void f(const c00 & c) //3 error
{
}
};

void f(const c00 & c)
{
}

void main()
{
c10 t10;
c11 t11;
c12 t12;
f(t10); //1 ok
f(t11); //2 error
f(t12); //2 error
}
loveour 2009-09-14
  • 打赏
  • 举报
回复
protected可以做一个类似的比较
loveour 2009-09-14
  • 打赏
  • 举报
回复
上面说了private,protect称为实现。
其实比较容易理解的是,如果是私有继承,那么基类的public方法在派生类中也为private,也就不能够被外部使用;所谓转换,应该是说能够把派生类当作基类使用,能够把派生类对象当作基类对象使用;在私有继承的情况下,这一点显然就不成立了。因为,基类可用的方法不再可用。
yshuise 2009-09-14
  • 打赏
  • 举报
回复
public继承才称为多态方法,private,protect称为实现。
Kusk 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kusk 的回复:]
我的理解:

3)
class Base;
class Sub: private Base;
class Sub2: xxxxxx Sub;
则Sub2的对象不能转为Base对象。

4)
class Base;
class Sub: protected Base;
class Sub2: xxxxxx Sub;
则Sub2的对象(可能)可以转为Base对象。
[/Quote]

对了,这个不是确定。楼主还需要自己试一下。
Kusk 2009-09-14
  • 打赏
  • 举报
回复
我的理解:

3)
class Base;
class Sub: private Base;
class Sub2: xxxxxx Sub;
则Sub2的对象不能转为Base对象。

4)
class Base;
class Sub: protected Base;
class Sub2: xxxxxx Sub;
则Sub2的对象(可能)可以转为Base对象。
sinux_1983 2009-09-14
  • 打赏
  • 举报
回复
mark
zhongchengli 2009-09-14
  • 打赏
  • 举报
回复
bangding

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧