小结:虚函数

来源:互联网 发布:橱柜拆单软件 编辑:程序博客网 时间:2024/04/29 19:43

关于虚函数的一些要点:

1.在基类声明函数时使用关键字virtual使该函数在基类以及所有派生类中是虚的

2.在继承中,只有使用指针或者引用的方式来调用虚函数时,虚函数才能发挥多态性的作用

3.被继承的虚函数仍然是虚函数

4.编译器对非虚方法使用静态联编,对虚方法使用动态联编。在虚函数中使用成员限定可以强行解除动态联编,如:

           (B为A类的派生类,并在A类中定义了虚函数get())

           A*p =new new B;

           cout<<p->A::get();    //成员名限定会强制使用静态联编来调用类A函数         

5.对于静态联编,由于对象不用对自身进行跟踪,因此速度浪费比较小,而动态联编虽然可以动态跟踪对象,灵活性比较强,但是速度浪费严重。.如果要在派生类中重新定义基类的方法,则将它设置为虚方法。但如果,派生类不重新定义基类的任何方法,也不需要使用动态联编,则使用静态联编更合理,效率更高。


A类中func已定义为虚函数,执行p->func()时系统会自动判断父指针p指向的是哪个对象,由于父指针指向的是子类对象,所以该语句实际上时调用子类对象的func()函数时,因此输出的是“类B”而不是“类A”.

另一个要注意的地方是,在以上例子中还定义了虚析构函数。如果析构函数不是虚函数,则它只具备父类析构函数的功能,在delete时delete的对象是父类的对象,而子类没有销毁,造成内存的泄露,定义虚析构函数,则在上述代码中执行delete p时,先调用派生类的析构函数,派生类的析构函数再自动调用基类的析构函数,使构造的整个对象都会销毁。从运行结果可以看到delete执行的过程。




原创粉丝点击