该做法的意义何在,姑且不论。今天我们主要关注该功能的实现,至少在实现的思路上是对面向对象思想的一次深入理解。

首先一点,父类引用是无法调用子类独有的方法(不仅无法访问,而且是不可见的),结论是显然的,不然该方法就不作为子类所独有了,不然子类就没有任何的独特之处了(隐私空间),也就丧失了子类存在的意义。

// C++
class Base
{};
class Derived :public Base
{
public:void foo() {}
};int main(int, char**)
{Base* pBase = new Derived;pBase->foo();// class “Base” 没有成员 “foo”return 0;
}

解决方案是,在父类中声明一个虚函数用以向下类型转换,在父类中给出其接口实现(否则会出现链接错误),在子类中自然给出其真正实现。

class Derived;  // 前置声明
class Base
{
public:virtual Derived& downcast(){ return *(Derived* )NULL; }virtual const Derived& downcast() const{ return *(Derived* )NULL; }
};class Derived :public Base
{
public:Derived& downcast(){ return *this;}const Derived& downcast() const{ return *this;}void foo(){}
};

注意,因为在父类Base要用到子类Derived类的声明,我们需要在父类的定义之前,对子类进行前置声明(forward declaration)。

int main(int, char**)
{Base* pBase = new Derived;pBase->downcast().foo();// 通过return 0;
}

如何通过父类引用“调用”子类所独有的方法相关推荐

  1. 如何通过父类引用“调用”子类所独有的方法(向上转型意义)

    最近看书,看到向上引用的情况:派生类引用或指针转换为基类引用或指针被称为向上强制转换. BrassPlus dilly("Annie Dill",493222,2000); Bra ...

  2. 关于java多态性之父类引用指向子类对象

    在使用多态前,要确保两个类之间是继承关系 public class Animal{}public class Dog extends Animal{} 之后创建对象: Animal animal1 = ...

  3. 父类引用指向子类对象的方法调用问题

    阅读如下代码,结果是什么? public class Person {String name = "person";public void shout(){System.out.p ...

  4. java多态父类引用指向子类对象为什么不能调用子类特有的方法?

    java多态父类引用指向子类对象为什么不能调用子类特有的方法? 我们在学习java面向对象时都会发现当父类引用指向子类对象不能调用子类特有的方法 首先我们需要了解一下java多态的具体体现 1.一个对 ...

  5. 父类引用指向子类对象详解

    父类引用指向子类对象 父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal ani ...

  6. java -----多态:父类引用指向子类对象

    生活中的人物视角 程序中的多态 概念:父类引用指向子类对象,从而产生多种形态 一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定 比 ...

  7. 父类引用指向子类对象

    父类引用指向子类对象,如何访问子类的属性? 1.第一种办法最简单,强制类型转化为子类. 2.父类引用指向子类对象,由于当前引用为父类,只能访问父类的字段和方法,但是根据多态性可以访问子类的方法,在这个 ...

  8. 深入了解父类引用指向子类

    父类应用指向子类对象指的是: 父类Animal,子类 Cat,Dog.当中Animal能够是接口或类,Cat和Dog是继承或实现Animal的子类. Animal animal= new Cat(); ...

  9. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

最新文章

  1. 几种在Linux下查询外网IP的办法
  2. 设计模式-结构型-代理
  3. 美团--最小唯一前缀
  4. 中国智能高清视频监控未来发展趋势
  5. css实现简单的loading效果
  6. Word 软回车和硬回车
  7. 【stata】如何快速上手stata软件
  8. matlab求松弛迭代发,[求助]Matlab超松弛迭代法 高手帮忙看看
  9. 从零基础到web前端工程师(三)
  10. beego/logs模块的使用
  11. [原创]四大开源3d游戏引擎探究(前言上)
  12. oul可以用作c语言常量吗,STL chips
  13. 工业物联网的数据集成
  14. Android 修改特殊字体样式
  15. DaoCloud道客云原生开源项目KLTS,全称为Kubernetes Long Term Support,为Kubernetes早期版本提供长期免费的维护支持
  16. 在html中如何做个人微博,学习记录:爬取个人微博
  17. 后知后觉-观sicp
  18. 年终工作总结ppt模板怎么做? 工作总结ppt制作的方法
  19. web JSP的动态交互 cs与bs结构的区别, bs结构的超详细解释,jsp的表单验证
  20. Kafka Eagle服务部署

热门文章

  1. vue状态管理存取数据_Vue中的数据通信和状态管理
  2. 背包问题:从给定的无序、不重复的数组 A 中,取出N个数,使其相加和为M
  3. Python基础——元组与列表
  4. OpenCV探索之路(五):图像变换——边缘检测(canny、sobel、laplacian)
  5. 图像处理:透镜畸变及校正模型
  6. 原生JS操作DOM对象
  7. chrome 设置是否缓存
  8. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)
  9. MoreLinq和Linq
  10. debian修改主机名