1、virtual析构函数的作用 当定义了一个基类,并用来继承的。当其他类用到基类,其析构函数必须是虚函数,不然在调用基类析构函数的时候,不会去调用子类的析构函数,从而会造成内存泄漏。 class A { public: A() { ptra_ = new char[10];} ~A() { delete[] ptra_;} // 非虚析构函数 private: char * ptra_; }; class B: public A { public: B() { ptrb_ = new char[20];} ~B() { delete[] ptrb_;} private: char * ptrb_; }; void foo() { A * a = new B; delete a; } 例子中在执行delete a的时候,实际上只调用了~A(),并没有对B类的析构函数进行调用。
2、virtual继承作用 当基类的函数为虚函数的时候,可以通过基类去访问子类的函数。 class A { public: void print() { cout << “A()” << endl; } };
class B : public A { public: virtual void print() { cout << “B()” << endl; } };
class C : public B { public: virtual void print() { cout << “C()” << endl; } };
int _tmain(int argc, _TCHAR* argv[]) { A* ap; B* bp; B b; C c;
ap = &b; ap->print(); ap = &c; ap->print(); bp = &c; bp->print(); return 0;} 输出结果为:A() A() C()