分类: C/C++
2008-12-18 22:05:38
被virtual修饰的成员函数就是虚函数,虚函数的引入是为了实现多态性。
把基类的成员函数设为virtual,其派生类中相应函数也自动变成虚函数。
使用指向基类对象的指针在操作它的多态类子类对象时,会根据不同的类对象,调用响应的函数,这个函数就是virtual函数。(它是运行期绑定,不像普通函数编译器绑定)
当类中有虚函数时,编译器会自动在类体中插入一个vptr指针(虚函数指针),并为该类创建一个vtbl表(虚函数表),vptr指向该vtbl表。vtbl表中存放了该类中虚函数的地址。vtbl表实际上就是一个函数指针数组。
纯虚函数也是基类中声明的virtual函数,但它在基类中没有定义。含有纯虚函数的类称为抽象类,抽象类不能定义对象。抽象类的派生类如果没有全部实现所有纯虚函数的定义就自动转成抽象类,也不能定义对象。
注意:虚函数和纯虚函数定义中都不能有static,原因很简单,因为被static修饰的函数要求在编译器绑定,而虚函数是动态绑定的(运行期绑定)。且被两者修饰的函数声明周期也不一样。
虚函数的声明方法:
virtual void function();
纯虚函数的声明方法:
virtual void function() = 0;