|
派生类与基类之间的有以下几个特殊关系
1. 派生类对象可以使用基类的方法,条件是方法不是私有的。
2. 基类指针可以在不进行显示类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象,比如:- RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
- TableTennisPlayer & rt = rplayer1;
- TableTennisPlayer * pt = &rplayer1;
- rt.Name() // 引用调用方式
- pt->Name(); // 指针调用方式
复制代码 其中 TableTennisPlayer 是基类, RatedPlayer 是其派生类;Name() 是基类的方法。
基类指针或引用只能用于调用基类的方法,不能用 rt 或 pt 来调用派生类的方法,因为基类本身就没有派生类的方法。
3. 通常,C++ 要求引用和指针类型与赋给的类型相匹配,但这一规则对继承来说是个例外。但是,这种例外只是单向的,不可以将基类对象和地址赋给派生类的引用和指针:- TableTennisPlayer player("Betsy", "Bloop", true);
- RatedPlayer & rr = player; // 不允许
- RatedPlayer * pr = player; // 不允许
复制代码 如果将基类对象赋给派生类的引用,那会发生什么事情呢?派生类引用因此能够为基类对象调用派生类的方法,这样会有问题,因为假如基类对象调用了派生类的方法,而该方法操作的是派生类的成员,而这成员自然没有在基类里面,因此这么做没有意义。
打个比方,手机是基类,智能手机是其派生类,手机基类拥有手机的基本属性特征,但高级特征不会给出。通过按键可以调节手机的音量,这个是基类的方法,派生类智能手机也继承了这一方法,但是智能手机还有自己调节音量的方法,即通过触摸屏调节。因此,你将智能手机的对象赋值给手机对象的引用或指针,那么该引用或指针引用“手机”中的方法自然是没有问题的,但它不能调用“智能手机”中的方法,因为它没有!
如果将“手机”对象赋值给“智能手机”的引用,那么“手机” 对象就可以去调用智能手机中的方法,比如上述的“通过触摸屏来调节音量”,这显然是不行的,因为“手机”对象根本不具备这一高级特征。
|
|