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