虚函数是为了满足多态和泛型编程。
C++允许使用虚函数完成完成运行时决议(运行时多态),与编译时决定(编译时多态,函数重载)不同。

虚函数与纯虚函数
  1. class AbstractBaseClass
  2. {
  3. public:
  4. virtual void fun1(){ // 普通虚函数
  5. cout << "AbstractBaseClass::func1()" << endl;
  6. };
  7. virtual void fun2()=0; // 纯虚函数
  8. };
  9. class BaseClass: public AbstractBaseClass
  10. {
  11. public:
  12. virtual void fun1(){
  13. // 继承来的fun1()已是虚函数,virtual可不加
  14. cout << "BaseClass::func1()" << endl;
  15. }
  16. virtual void fun2(){
  17. cout << "BaseClass::func2()" << endl;
  18. };
  19. };
  20. class DerivedClass
  21. {
  22. public:
  23. void fun1(){
  24. cout << "DerivedClass::func1()" << endl;
  25. }
  26. virtual void fun2(){
  27. cout << "DerivedClass::func2()" << endl;
  28. }
  29. };

含有纯虚函数的类不能实例化对象;
子类如果要实例化对象,继承的纯虚函数(类BaseClass的func2())需重新声明,且不能再次声明为纯虚函数。

含有虚函数的类实例化得到的对象都有虚函数表指针,虚函数表存放虚函数指针,每个虚函数对应一个虚函数指针(与普通指针一致),且该指针总被存放于该对象的地址首位。这些虚函数指针构成了虚函数表,虚函数表被类的所有对象共享。

(虚函数)指针在32位编译器中占4个字节,在64位编译器中占8个字节。
具体占多少可以参考看头文件climits.h