码迷,mamicode.com
首页 > 其他好文 > 详细

虚函数

时间:2016-01-03 00:24:38      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

  在类的编程中,要能进行抽象编程,不随类的改动而改动,类机制必须解决这个问题。在C++中那就是虚函数机制。基类与派生类的同名操作只要标记上virtual(虚拟)就可以),则该操作就具有多态性。

   在调用子类和基类同名虚函数标志函数时,使得该捆绑操作滞后运行,以实际对象类型来捆绑其对应成员函数的操作,此时做一个指向实际对象的成员函数的间调用。于是实际对象若是基类则调用基类成员函数,若是子类则调用子类成员函数。当然每个对象都额外占有一个指针空间来指向类中的虚函数表。使用了虚函数类比不使用虚函数类多了一个指针空间,当然这不算什么,但是涉及的操作,间接访问虚函数,对象指针偏移量计算等,所以采用了虚函数,会影响一些程序运行的效率。

   编译器遇到虚函数调用时会做一个滞后处理。由于间接访问比直接访问饶了一个弯,于是付出了时间代价和保存若干指针的空间代价,为了类编程随时体现多态性,只要继承结构要尽量将成员函数设计为虚函数。在一些讲究性能的小规模编程中,也用该不设置为虚函数。在偏向应用型的Java中,一切类都规定为虚函数性质,程序员链选择virtual的机会都没有,当然也影响了java的性能。

   虚函数在继承关系下会传递下去,这说明子类的成员函数前的virtual可以省略。另外要区分重载,覆盖,重载时函数名相同但是参数不同,而覆盖是两者都相同,如果子类出现同名重载的函数加上virtual也不会出现多态。

  关于虚函数的限制问题:

  1.只有类的成员函数才可以声明为虚函数,这是由于虚函数仅仅适合于有继承关系的类对象,所以普通函数是不可以声明为虚函数的。

  2.静态成员函数不可以是虚函数,因为静态成员函数不受对象的捆绑,没有任何的对象信息

  3.内联函数不可以是虚函数,因为内联函数是不可以在运行时动态的确定其位置的。

 4.构造函数不可以是虚函数,构造时对象还没完全出现,谈不上与对象捆绑

 5.析构函数可以是虚函数,而且常声明为虚函数,例如当基类指针了能指向不同的子类对象时,以该指针捆绑实现释放空间操作,应该是针对不同类的析构函数。

void f(std::vector<Base*>v)(){......}

//--------------------

for(i=0;i<v.size();i++)

    delete v[i];

上面程序delete v[i]在实施时候,会有相应调用捆绑的析构函数。向量中的元素有指向基类,有指向子类对象,所以在析构是应该指向不同对象做不同的析构工作。

虚函数

标签:

原文地址:http://www.cnblogs.com/td15980891505/p/5095411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!