1.虚函数的实现原理:

在有虚函数的类中,类最开始的部分是虚函数表的指针,这个虚函数表存放了虚函数的地址。

当子类继承父类时,同时也会继承父类的虚函数表,如果子类重写了父类的虚函数,将会将从父类中继承的虚函数表的地址改为重写后的地址。

然后程序在运行时,编译器会根据对象的类型去初始化这个虚函数表指针。所以在调用虚函数的时候,能正确的找到相应的函数。

2.为什么虚析构能正确释放资源:

当delete一个类指针时,编译器会去检查该类是否是虚析构,如果是虚析构,他就会去检查实例的虚函数表,从表中取到子类的虚析构函数地址,然后执行(调用析构函数会隐式调用父类的虚析构函数)。