虚函数相关

来源:互联网 发布:微擎源码破解版 编辑:程序博客网 时间:2024/05/03 14:28

虚函数相关

虚函数

        在基类中声明为virtual并在一个或多个派生了中重新定义的成员函数。作用:是实现多态性,多态性是将接口和实现进行分离。多态有个关键之处:用指向基类的指针或引用来操作对象。
<span style="font-size:14px;">class animal{public:void Funct1(){cout<<"Animal!\n";}};class dog : public animal{public:void Funct1(){cout<< "Dog!\n";}};int _tmain(int argc, _TCHAR* argv[]){animal *p = NULL;animal a;dog d;p = &a;p->Funct1();p = &d;p->Funct1();return 0;}</span>
       运行这段代码发现输出都是"Dog",注意:不管引用的实例是哪个类的,系统会调用左值对象所属类的方法。这里p是animal的指针。这种叫静态联编,编译器在编译时就确定了。如果想实现跟据实例的不同来动态决定调用哪个函数呢?这就须要用到虚函数(也就是动态联篇)。
class animal{public:virtual void Funct1(){cout<<"Animal!\n";}};class dog : public animal{public:virtual void Funct1(){cout<< "Dog!\n";}};
        所谓虚函数就是在编译的时候不确定要调用哪个函数,而是动态决定将要调用哪个函数。它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,编译器就可以使用后期绑定来达到多态了,也就是:用基类的指针来调用子类的这个函数。
要实现虚函数必须保证派生类的函数名与基类相同,参数名参数类型等也要与基类相同。但派生类中的virtual关键字可以省略,也表示这是一个虚函数。
定义虚函数的限制:
类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。最好将析构函数定义为虚函数因为,当利用delete删除一个指向派生定义的对象指针时,系统会调用相应类的析构函数。

纯虚函数

        纯虚函数是一种特殊的虚函数,在多数情况下,基类中不能对虚函数给出有意义的实现,而把它声明为虚函数,它的实现留给该基类的派生类去做,这就是纯虚函数的作用。
纯虚函数的一般格式如下:
<pre name="code" class="cpp">class<类名>{virtual <类型><函数名>(<参数表>)=0;…};
        纯虚函数可以先让类具有一个操作名称,而没有操作内容,让派生类在继承时再去给出定义,凡是含有虚函数的类叫做抽象类。这种类不能声明对象,只能作为基类为派生类服务,除非派送类实现了基类中所有的纯虚函数,否则派送类也变成了抽象类而不能实例化对象。一般纯虚函数的函数体是缺省的,但是也可以给出纯虚函数的函数体,调用纯虚函数的方法为baseclass::virtual function.
        若要使派生类为非抽象类,则编译器要求在派生类中必须对纯虚函数予以重写实现多态性,同时含有虚函数的类称为抽象类。
多态性:
        指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性运行时多态性
a.编译时多态性:通过重载函数和运算符重载实现。
b运行时多态性:通过虚函数和继承实现。

虚函数
    1, 虚函数是非静态的、非内联的成员函数。

    2, 若类中一个成员函数被说明为虚函数,则该成员函数在派生类中可能有不同的实现。当指向基类的指针操作它的对态类对象时,会根据不同的类对象,调用其相应的函数。该成员函数调用采用动态联编。
    3, 定义了虚函数后,程序中声明的指向基类的指针就可以指向其派生类。在执行过程中,该函数可以不断改变它所指向的对象,调用不同版本的成员函数,而且这些动作都是在运行时动态实现的。虚函数充分体现了面向对象程序设计的动态多态性。虚函数充分体现了面向对象程序设计的动态多态性。

纯虚函数
    1, 当在基类中不能为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数,其实现留待派生类完成。
    2, 纯虚函数的作用是为派生类提供一个一致的接口,它只是个函数的声明而已,它告诉编译器,在这个类中的这个纯虚函数是没有函数定义的,该类不能创建对象(即不能实例化),但可以声明指针,该类的派生类负责给出这个虚函数的重载定义。


注意:1、构造函数不能是虚函数,而且构造函数中调用虚函数,实际执行的是父类对应函数,因为自己还没有构造,多态是无效的。2、纯虚函数通常没有定义体,但也可以有。3、析构函数可以使纯虚的,但是纯虚析构函数必须有定义体,因为析构函数的调用是在子类中隐含的。4、非纯虚函数必须有定义体,否则是个错误。


0 0
原创粉丝点击