写成虚的是为了在实现多态的时候不造成内存泄露, 比如: class a { int aa; public: virtual ~a(){}; }; class b : public a { int bb; }; 如果你这样: a *pa = new b; // upcast 然后这样: delete pa; 这句delete, 如果你基类的析构函数不是虚的的话, 就会造成内存泄露, 具体表现为派生类的内存被释放了而基类没有.