关于基类的虚析构函数,该如何处理
关于基类的虚析构函数
比如说下面的代码:
class A{
public:
virtual ~A(){ cout << "A::destructor" << endl;}
};
class B : public A{
public:
~B(){ cout << "B::destructor" << endl;}
};
B类并没有重写~A()函数,但是A* p = new B();delete p;会先调用~B(),然后调用~A(),如果按照虚函数的语义,delete p时,编译器不应该去找B类中是否重写了~A()函数么。那在处理虚析构函数时,岂不是与普通虚函数不一致?
------解决思路----------------------
编译器对析构函数的处理是比较特殊的 你记住就可以了
只要在基类里把析构函数声明成virtual的,就可以正常调用析构函数
一个子类其实是一个基类 加 一些新的成员 所以其实子类里也一定有基类的析构函数
总之编译器有办法让它正常运行
比如说下面的代码:
class A{
public:
virtual ~A(){ cout << "A::destructor" << endl;}
};
class B : public A{
public:
~B(){ cout << "B::destructor" << endl;}
};
B类并没有重写~A()函数,但是A* p = new B();delete p;会先调用~B(),然后调用~A(),如果按照虚函数的语义,delete p时,编译器不应该去找B类中是否重写了~A()函数么。那在处理虚析构函数时,岂不是与普通虚函数不一致?
------解决思路----------------------
编译器对析构函数的处理是比较特殊的 你记住就可以了
只要在基类里把析构函数声明成virtual的,就可以正常调用析构函数
一个子类其实是一个基类 加 一些新的成员 所以其实子类里也一定有基类的析构函数
总之编译器有办法让它正常运行