关于多态的小结
来源:互联网 发布:部落冲突x连弩升级数据 编辑:程序博客网 时间:2024/06/05 19:01
什么是多态?
多态按照字面的意思就是“多种状态 ”的意思。在C++中多态有着更广泛的含义。下面着重介绍C++语言中关于多态的一些知识点。
C++中多态分为静态多态和动态多态。静态多态通过函数重载和泛型编程实现。动态多态通过虚函数来实现。参照下图:
静态多态:
编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。
int Add(int a1, int a2){ return a1 + a2;}double Add(double d1, double d2){ return d1 + d2;}int main(){ cout << Add(10, 20) << endl;//调用第一个函数 cout << Add(12.3, 34.5) << endl;//调用第二个函数 return 0;}
以上例子是通过函数重载实现静态多态的。
4. 动态多态:
动态绑定:在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方 法。
使用virtual关键字修饰函数时,指明该函数为虚函数,派生类需要重新实现,编译器将实现动态绑定。
class Base{public:virtual void FunTest1()//虚函数{cout << "Base::FunTest1()" << endl;}virtual void FunTest2()//虚函数{cout << "Base::FunTest2()" << endl;}};class Derived:public Base{public:void FunTest1()//对基类的基类虚函数FunTest1()进行重写{cout << "Derived::FunTest1()" << endl;}void FunTest3(){cout << "Derived::FunTest3()" << endl;}void FunTest4(){cout << "Derived::FunTest4()" << endl;}};int main(){Base b;Derived d;b.FunTest1();b.FunTest2();d.FunTest1();//对基类函数进行了重写,调用派生类的函数d.FunTest2();//未对基类函数进行重写,调用基类函数d.FunTest3();d.FunTest4();Base *pb = &b; pb->FunTest1();pb = &d;pb->FunTest1();return 0;}
以上代码运行结果如下:
由运行结果可知:
(1).如果在派生类中对基类函数进行了重写,则在派生类中就调用派生类的成员函数。否则将调用基类的成员函数。
(2).动态绑定条件:
a.必须是虚函数
b.通过基类类型的引用或者指针调用
5.纯虚函数
在成员函数的形参后面写上=0,则成员函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。
纯虚函数举例:
class A{virtual void Test() = 0;//纯虚函数};
6.总结:
(1).派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同。
(2).基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性。
(3).只有类的成员函数才能定义为虚函数,静态成员函数不能定义为虚函数。
(4).如果在类外定义虚函数,只能在声明函数时加virtual关键字,定义时不用加。
(5).构造函数不能定义为虚函数
(6).不要在构造函数和析构函数中调用虚函数,在构造函数和析构函数中,对象是不完整的,可能会出现未定义的行为。
(7).虚表是所有类对象实例共用的。
本文出自 “10912110” 博客,请务必保留此出处http://10922110.blog.51cto.com/10912110/1765783
- 关于多态的小结
- 关于C++的小结
- 关于IsPostBack的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于resultset的小结
- 关于PCB的小结
- 关于ALSA的小结
- 关于ALSA的小结
- 关于Contentprovider的小结
- 关于 angularjs 的小结
- 关于RNN的小结
- 关于状态栏的小结
- 关于const的小结
- C语言趣味编程两小例
- 用C语言实现简单的三子棋小游戏
- 关于继承与派生的小结
- 模板的特化
- 推荐系统_基于内容的推荐
- 关于多态的小结
- 下载谷歌浏览器(Chrome)扩展离线安装包crx文件最简单的方法
- 证书过期:The certificate used to sign "###"...
- [Android]libpng error: Not a PNG file错误解决
- SDK使用心得
- “Red and Black(红黑瓷砖),ZOJ2165”的一种解法
- C# 枚举绑定到ComboBox
- 定语从句(基础)
- 【BZOJ4310】跳蚤,后缀数组+ST表求LCP+二分答案