多态与虚函数的使用
2016-03-28 18:47
411 查看
注意:本文中提到的所有方法都指的是同名,同返回类型,同参数类型的方法
多态:同一方法可以处理多种调用该方法的对象(即一个接口,多种实现)
多态的实现的前提:
1.多态得存在于继承体系中
2.多态的实现必须存在虚拟(virtual)关键字
若该方法在类外实现,则不用加关键字virtual
例如:
3.多态必须通过父类的引用或指针来实现
虚函数的定义格式:
virtual 返回类型 函数名(参数列表)
注意:
1.virtual仅用于类定义中,若在类外定义虚函数不可以加关键字virtual
多态:同一方法可以处理多种调用该方法的对象(即一个接口,多种实现)
多态的实现的前提:
1.多态得存在于继承体系中
class base { public: void show() { cout<<"this is base show!"<<endl; } }; class D : public base //继承关系 { public: void show() { cout<<"this is D show!"<<endl; } }; void main() { D d; base *p = &d; //p只能指向父类的函数和数据 p->show(); //此时show是父类中的show函数 }
2.多态的实现必须存在虚拟(virtual)关键字
若该方法在类外实现,则不用加关键字virtual
例如:
class base { public: virtual void show() //加入virtual关键字使得子类虚拟继承父类,但实际上子类并不能调用此方法 { cout<<"this is base show!"<<endl; } }; class D : public base //子类D继承父类base { void show() { cout<<"this is D show!"<<endl; } }; void main() { D d; base *p = &d; p->show(); //此时show调用的是D中的show方法 }
3.多态必须通过父类的引用或指针来实现
class base { public: void show() { cout<<"this is base show()!"<<endl; } }; class D : public base { public: void show() { cout<<"this is D show()!"<<endl; } }; void main() { D d; base *p = &d; //通过指针实现多态 p->show(); base &q = d; q.show(); //通过引用实现多态 }
虚函数的定义格式:
virtual 返回类型 函数名(参数列表)
注意:
1.virtual仅用于类定义中,若在类外定义虚函数不可以加关键字virtual
class base { public: virtual void show(); //虚函数的声明 }; void base :: show() //虚函数的定义(在类外定义无需加virtual关键字) { cout<<"this is base show()!"<<endl; }
>2.当某个类的一个类成员函数为虚函数,则由该类派生出来的所有类中,该函数始终保持虚函数的特征
class base { public: virtual void show() { cout<<"this is base show()"<<endl; } }; class D : public base { public: void show() { cout<<"this is D show()!"<<endl; } }; class C : public D { public: void show() { cout<<"this is C show()!"<<endl; } } void main() { C c; D *pd = &c; //因为D是base的派生类,base中的show是虚函数所以D中的也保持虚函数的特征 pd->show(); //此时调用的是C中的show方法 }
相关文章推荐
- 求字符串中最长无重复字符的子串
- 悲观锁和乐观锁
- Hadoop完全分布式集群安装
- 使用RecyclerView替代ListView
- 【JQuery】[attribute*=value]属性选择器
- C++内存管理(内存分配、内存泄漏、内存回收)
- nib、xib和storyboard的区别
- 简单用户注册界面
- 结对编程
- pragma comment(linker,"/export:Add=OrgTestDll.Add,@1")
- 一些Linux世界的术语
- 双目运算符的重载
- 面试问题1:给一个无序数组,找到其中位数。
- 吐槽CodeDom
- node.js学习笔记之浅谈观察者模式
- NYOJ 123士兵杀敌(四)【树状数组||区间树】
- 51NOD 1351 吃点心 贪心
- [offer收割]编程练习赛3-题目2:机会渺茫
- Jquery -post
- Genymotion使用中碰到的问题总结