在编译过程中,函数是通过其地址而被定义的.当编译器遇到一个函数调用时,使用函数的地址来代替它.
虚函数的地址在编译时是不知道的.在基类的函数声明中使用Virtual关键字,就意味着要在随后的派生
类中重载它.
当编译器遇到一个虚函数时,它创建一个虚函数地址表,并且是在运行时,参考这个表来决定该
调用哪个函数.甚至如果虚函数是一个库文件,而且没有源代码,也仍然可以在派生类中声明一个相似的函数
来重载它.这种处理被称为动态绑定或者后绑定(你晓得动态绑定吗?).显而易见,附加的虚函数地址表需要
更多的文件空间,而且加载它也会因为要进行绑定而花费更多的时间,所以不要滥用虚函数.
如果有一系列的使用相同函数的派生类,也可以把它们声明为虚的.运行时代码会查找虚函数表,直到
它找到一个不是虚函数的函数或者到达继承链的结尾.
可以把一个函数声明为虚的,并把它的地址设为0,这样函数就成了个虚函数.
virtual int fun()=0;
从本质上讲,编译器知道我们由于某个原因而想声明这个函数,但是又要求它被重载,所以
没有定义它.提供函数定义责任落到了派生类的身上.(讲的头都晕了!!!!!!)