C语言中虚函数是如何实现多态性的?