关于C++多态的一些概念和理解

概括:“一个接口,多种方法”,程序在运行时才决定调用的函数;
实现:通过虚函数实现,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法成为遮蔽或重写(重写分为两种,重写成员函数和重写虚函数,只有重写虚函数才能体现C++的多态),而重载并没有体现多态性:
这里简单概括下重载:重载允许允许多个同名的函数,而这些函数的参数列表不同,允许的参数个数不同,参数类型不同,或者两者都不同。当函数调用时,编译器会根据传入的参数去逐个匹配这些函数的参数,匹配对应的函数,如果匹配失败编译器会报错;
常见多态用法:声明一个基类指针,指向任意一个派生类对象,然后调用相应的虚函数,可以根据指向的派生类的不同而采取不同的方法;形如:
基类People中声明的虚函数virtual void display();派生类Teacher,Student中声明的void display();
People *p = new Teacher(“wang”,33);
People *q = new Student(“zhang”,22);
p->display(); //调用的是Teacher中的display();
q->display(); //调用的是Student中的display();
这个例子很好的体现了多态性;

而在上面例子中也可以看出,虚函数对于多态实现的作用:有虚函数才能构成多态;
1.只需在虚函数的声明处加上vircual关键字;
2.通常只需要在基类中的函数声明为虚函数,这样所有派生类中具有遮蔽(覆盖)关系的同名函数都将自动声明为虚函数;(如果其派生类为其他类的基类的话,若要体现多态则任需加上vircual);
3.当在基类中重新定义了虚函数,如果派生类没有重新定义函数来遮蔽此函数,那么将使用基类的虚函数;
4.只有派生类的虚函数 遮蔽 基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)如:基类虚函数原型:vircual void func();派生类虚函原型:vircual void func(int);基类指针p指向派生类对象时,p->func(100);则会出错,而p->func();则会调用基类函数;
5.构造函数不能是虚函数。因为派生类不能继承基类的构造函数,仅仅是调用,所以将析构函数声明为虚函数没有意义。
———>为什么?
1.因为虚函数是在运行过程确定实际类型,而在构造一个对象时,该对象还未构造成功。编译器无法确定对象的类型是基类还是派生类,
2.虚函数的执行依赖于虚函数表,而在构造函数时虚函数表还没有初始化

6.析构函数可以声明为虚函数。

构成多态的条件:
必须存在继承关系;
继承关系中必须有同名的虚函数,并且他们是遮蔽(覆盖)关系;
存在基类指针,通过该指针调用虚函数;

    学习自PPT                                                                                                          

猜你喜欢

转载自blog.csdn.net/kuimzzs/article/details/79791243