是否只有通过基类指针或引用间接指向派生类子类型时,多态性才会起作用?
2016-06-11 21:20
302 查看
来自:http://www.ithao123.cn/content-971985.html
问题2:是否只有通过基类指针或引用间接指向派生类子类型时,多态性才会起作用?
等级:初级只有通过基类指针或引用间接指向派生类子类型时,多态性才会起作用。使用基类对象并不会保留派生类的类型身份,不再具备多态性。
深入讨论:
这个问题和答案有一点模糊,让我们通过一个示例来明确这个问题。
#include <iostream> class Base { public: virtual void f() { std::cout<< “Calling Base::f()…/n”; }; }; class Derived: public Base { public: virtual void f() { std::cout<< “Calling Derived::f()…/n”; }; }; |
Base* pb = new Base(); Base* pd = new Derived(); pb->f(); pd->f(); Base& rb = *pb; Base& rd = *pd; rb.f(); rd.f(); |
Calling Base::f()... Calling Derived::f()... Calling Base::f()... Calling Derived::f()... |
Derived d; Base b = d; // d被“切割”成一个Base对象 d.f(); |
Calling Base::f()... |
这也是C++被人广为诟病的特性之一,作为一种面向对象编程语言,我们必须使用指针以引用而不是对象来支持面向对象程序设计。
可能有一些善于思考的读者会想到一种情况:如果基类对象通过解引用操作符*获得,调用虚函数是否具备多态性?例如,执行如下代码会得到什么结果:
Base* pb = new Base(); Base* pd = new Derived(); Base b = *pd; b.f(); (*pd).f(); |
Calling Base::f()... Calling Derived::f()... |
参考资料:
《C++ Primer》第四版章节17.5导言部分。
《Inside C++ Object Model》章节1.3。
相关文章推荐
- Go语言并发之美
- 第十五周学习进度条
- 傅里叶变换 By ZZP&ZZL
- itables
- SpringMVC中的注解驱动(九)
- 额 好吧
- java访问修饰符 Modifier
- 答辩题
- MFC画图
- pandas选取特定索引的行
- Eclipse,MyEclipse增强html代码提示功能
- MySQL分库,分表备份的思路和方法
- viewpager页显示
- Java设计模式——单例模式
- mongodb 最新版本高可用解决方案-replica sets副本集部署详细过程
- Visual Studio 2010 复制代码到word时出现中文乱码的解决办法
- Elasticsearch 下载 安装
- java学习总结六:abstract抽象类
- PupopMenu 弹出菜单
- 欢迎使用CSDN-markdown编辑器