如何通过父类引用“调用”子类所独有的方法
2016-02-24 12:21
447 查看
该做法的意义何在,姑且不论。今天我们主要关注该功能的实现,至少在实现的思路上是对面向对象思想的一次深入理解。
首先一点,父类引用是无法调用子类独有的方法(不仅无法访问,而且是不可见的),结论是显然的,不然该方法就不作为子类所独有了,不然子类就没有任何的独特之处了(隐私空间),也就丧失了子类存在的意义。
解决方案是,在父类中声明一个虚函数用以向下类型转换,在父类中给出其接口实现(否则会出现链接错误),在子类中自然给出其真正实现。
注意,因为在父类
首先一点,父类引用是无法调用子类独有的方法(不仅无法访问,而且是不可见的),结论是显然的,不然该方法就不作为子类所独有了,不然子类就没有任何的独特之处了(隐私空间),也就丧失了子类存在的意义。
// 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; }
相关文章推荐
- AWR报告提取 ORACLE10G RAC+AIX53
- ZoomControls控件是一个可以缩放控件,可以实现两个按钮控制图片的大小
- mysql空间数据相关操作
- [Locked] Count Univalue Subtrees
- 利用Nginx做负载均衡
- Android Seekbar间隔和自定义
- 程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]
- Android正则表达式使用及性能隐患分析
- HDU-1016(第一道DFS)
- HTTP请求报文和HTTP响应报文
- 在Android里面使用正则有性能隐患
- 程序员面试题精选100题(58)-八皇后问题[算法]
- 程序员面试题精选100题(59)-字符串的组合[算法]
- PHP 5.3 ereg() 无法正常使用,提示“Function ereg() is deprecated Error
- 程序员面试题精选100题(57)-O(n)时间的排序[算法]
- 程序员面试题精选100题(56)-C/C++/C#面试题(4)
- iOS新技术
- Android Studio Shortcut on MAC
- POJ 1703 Find them, Catch them (数据结构-并查集)
- iOS开发-graphics