公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
网上关于C++的文章没有 java 的多,这和 java 大多数框架都开源的关系密切相关。今天为大家分享一篇C++ 面向对象 多态的文章!
什么是多态
学过java的人,我想这对他一定不陌生。
多态:字面意思就是多种形态。在面向对象语言中,接口的多种不同实现方式即为多态!
在c++中也是如此,同一操作作用于不同的对象可以有不同的解释,有不同的结果。在运行时可以通过指向基类的指针,来调用实现派生类中的方法。
在c++中实现多态的方法:虚函数,抽象类,覆盖,模板(注意:重载和多态无关!)
对象类型
看下面的例子:
静态分类:静态多态(函数重载,泛型编程);动态多态(虚函数) 。
静态多态
int add(int left, int right) { return left + right; } float add(float left, float right) { return left + right; } int main() { cout << add(1, 2) << endl; cout << add(1.1f, 2.2f) << endl; system("pause"); return 0; }
动态多态
看下么的例子:
class CWashRoom { public: void GotoManWashRoom() { cout << "Man---->please left" << endl; } void GotoWomanWashRoom() { cout << "Woman--->please right" << endl; } }; class Person { public: virtual void GotoWashRoom(CWashRoom&_washroom) = 0; }; class man :public Person { public: virtual void GotoWashRoom(CWashRoom&_washroom) { _washroom.GotoManWashRoom(); } }; class woman :public Person { public: virtual void GotoWashRoom(CWashRoom&_washroom) { _washroom.GotoWomanWashRoom(); } }; void test() { CWashRoom washroom;//创建CWashRoom类的对象washroom int i = 0; for (i = 1; i <= 10; ++i) { Person* pperson;//创建person类指针,实现基类方法的调用 int iper = rand() % i; if (iper & 0x01) { pperson = new man; } else { pperson = new woman; } pperson->GotoWashRoom(washroom); delete pperson; pperson = NULL; Sleep(1000); } } int main() { test(); system("pause"); return 0; }
这里面涉及到重写。
virtual:关键字修饰类成员函数时,指明该函数为虚函数,派生类需要重新实现,编译器将会实现动态绑定。
动态绑定的条件:
- 必须是虚函数
- 通过基类类型的引用或者指针调用虚函数
继承体系中同名函数的关系
总结
- 在继承的结构下,基类必须要有有虚函数,派生类中必须要对基类的虚函数进行重写,通过基类的指针或者引用访问。
- 构造函数不能作为虚函数。(1,因为创建对象时我们总要明确指定对象的类型,而虚函数实在程序运行期间确定实际类型的。当对象没有构造成功时,编译器无法知道对象实际类型是该类本身还是该类的派生类,或者更深层次的派生类。2,虚函数的执行依赖于虚函数表。而虚函数表实在构造函数中进行初始化工作的。构造对象时,虚函数表还没有被初始化。)
- 静态成员函数不能作为虚函数。(静态成员函数没有this指针)
- 赋值运算符不建议作为虚函数。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!