-C++中的多态是由指向虚函数表的指针来完成的,那么指向虚函数表的指针是由编译器创建的,同时也是由编译器进行初始化。那什么时候对虚函数表指针进行初始化呢?
在这里只调用了父类的析构函数。
delete p此时删除的是一个父类的指针,没有将析构函数声明为virtual因此在这种情况下,编译器直接根据指针p的类型来决定调用哪个析构函数,因此就直接调用了父类的析构函数
如果将父类的析构函数声明为virtual,编译器就不会简单暴力的根据指针p的类型来调用父类的析构函数还是子类的析构函数。这时它又是怎样处理的?
由于析构函数是虚函数,所以在执行delete p的时候,编译器根据指针所指向的实际对象来决定如何调用析构函数。这是什么,多态啊。这就是将虚函数声明为虚函数的意义。
在工程开发中,通常将父类中的析构函数声明为虚函数,如果不这样做,有可能会发生内存泄露。因为它会跳过子类析构函数的调用,当子类析构函数中有释放内存的操作时,就发生内存泄露了。
构造函数和析构函数中不能发生多态行为,只能调用当前类中定义的函数版本。