曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 1907|回复: 0
打印 上一主题 下一主题

派生类与基类之间的几个特殊关系

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2013-10-9 22:20:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
派生类与基类之间的有以下几个特殊关系

1. 派生类对象可以使用基类的方法,条件是方法不是私有的。

2. 基类指针可以在不进行显示类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象,比如:
  1. RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
  2. TableTennisPlayer & rt = rplayer1;
  3. TableTennisPlayer * pt = &rplayer1;
  4. rt.Name() // 引用调用方式
  5. pt->Name(); // 指针调用方式
复制代码
其中 TableTennisPlayer 是基类, RatedPlayer 是其派生类;Name() 是基类的方法。


基类指针或引用只能用于调用基类的方法,不能用 rt 或 pt 来调用派生类的方法,因为基类本身就没有派生类的方法。

3. 通常,C++ 要求引用和指针类型与赋给的类型相匹配,但这一规则对继承来说是个例外。但是,这种例外只是单向的,不可以将基类对象和地址赋给派生类的引用和指针
  1. TableTennisPlayer player("Betsy", "Bloop", true);
  2. RatedPlayer & rr = player; // 不允许
  3. RatedPlayer * pr = player; // 不允许
复制代码
如果将基类对象赋给派生类的引用,那会发生什么事情呢?派生类引用因此能够为基类对象调用派生类的方法,这样会有问题,因为假如基类对象调用了派生类的方法,而该方法操作的是派生类的成员,而这成员自然没有在基类里面,因此这么做没有意义。

打个比方,手机是基类,智能手机是其派生类,手机基类拥有手机的基本属性特征,但高级特征不会给出。通过按键可以调节手机的音量,这个是基类的方法,派生类智能手机也继承了这一方法,但是智能手机还有自己调节音量的方法,即通过触摸屏调节。因此,你将智能手机的对象赋值给手机对象的引用或指针,那么该引用或指针引用“手机”中的方法自然是没有问题的,但它不能调用“智能手机”中的方法,因为它没有!

如果将“手机”对象赋值给“智能手机”的引用,那么“手机” 对象就可以去调用智能手机中的方法,比如上述的“通过触摸屏来调节音量”,这显然是不行的,因为“手机”对象根本不具备这一高级特征。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-21 12:53 , Processed in 0.065916 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表