c++多态

来源:互联网 发布:哈尔滨金蝶软件 编辑:程序博客网 时间:2024/06/05 23:48

多态:多态是C++三大特性之一。是指不同功能的函数可以用同一函数名,在系统运行时根据参数类型来调用相应的成员函数。

从系统实现角度来看,多态性分为两类,动态多态和静态多态。
1.静态多态性:函数重载和泛型编程属于静态多态,是在编译期间完成的。
2.动态多态性:(动态绑定)是在函数运行期间根据实际类型调用相应的方法,虚函数。
动态绑定的条件:
1.基类中必须含有虚函数。
2.通过基类类型的引用/指针来指向派生类对象的方法来调用。
虚函数:为了实现多态而引入的概念。作用是:允许派生类中重新重写与基类中同名的函数,并且通过父类的引用/指针来访问派生类中的成员函数。
一、虚函数使用方法
在基类中用关键字virtual申明成员函数为虚函数,这样就可以在派生类中重新定义该函数,赋予新的功能。
在派生类中重写该虚函数的:①基类中必须申明该函数为虚函数,②函数原型必须一致(函数名,参数列表,返回值)协变除外。
C++规定当一个成员函数被声明为虚函数后,派生类中的同名函数自动为虚函数,但在派生类中的重写的函数最好前面也加上virtual关键字。

#include<iostream>using namespace std;class Base{public:     virtual void Print()    {        cout << "Base::Print() " << endl;    }private:    int _b;};class D :public Base{public:    virtual void Print()    {        cout << "D::Print() " << endl;    }private:    int _d;};void test(Base &p){    p.Print();}int main(){    Base b;    D d;    test(b);    test(d);    return 0;}

这里写图片描述
穿的参数分别是指向派生类和基类对象的引用。
由上述例子得知多态成立条件:在继承体系下,要有虚函数的重写,用父类指针/引用指向子类对象。
说明:
1.构造函数不能为虚函数,因为构造函数是初始化对象用的,既然没有对象就不能调用虚函数,申明为虚函数也就没有意义,C++编译器规定构造函数不能为虚函数。
2.静态成员函数不能为虚函数,因为静态成员函数是类共享的成员函数,没有this指针也就不能访问到。
3.友元函数不能为虚函数,因为友元函数不是支持继承。也就不再继承体系下不能为虚函数
4.析构函数最好设置为虚函数。为了防止析构函数只析构基类,而不析构派生类的对象。例如 Base *pb=new D;如果只析构基类,就会存在内存泄漏等问题。
纯虚函数
在成员函数的参数列表后面加上=0,例如

virtual void Print()=0;

含有纯虚函数的类称为抽象类,不能够产生对象。
虚函数的调用
含有虚函数的类,对象模型里面多出4个字节,用来存放虚表指针,指向一个虚表。
这个虚表是编译器维护的。
多态的调用:取虚表地址,当前对象前4个字节,拿到相应的虚函数,调用虚函数。
派生类虚表里的虚函数顺序:
1.先拷贝基类的虚函数表。
2.如果派生类重写了基类的某个虚函数,就在相同的位置替换为派生类的虚函数。
3.最后是派生类自己的虚函数。

0 0
原创粉丝点击