parent_t这个祖先类的析构函数不是virtual的,但在子类指针析构时还是调用到了parent_t的析构函数,这是为什么?GCC 版本4.8.5
附上运行结果:
./test
B::func
~B
~A
~parent_t
delete done!
`class parent_t
{
public:
~parent_t() { printf("~parent_t\n"); }
public:
virtual void fun() = 0;
};
class A : public parent_t
{
public:
virtual ~A() { printf("~A\n"); }
public:
virtual void fun()
{
printf("A::fun\n");
}
};
class B : public A
{
public:
virtual ~B() { printf("~B\n"); }
public:
virtual void fun()
{
printf("B::func\n");
}
};
int main()
{
A* ptr_a = new B;
ptr_a->fun();
delete ptr_a;
printf("delete done!\n");
return 0;
}
`
1.(父类析构函数不是虚函数)使用父类指针指向子类对象,析构该子类对象时,只会调用父类析构函数
2.(父类析构函数是虚函数)使用父类指针指向子类对象,析构该子类对象时,会先调用子类的析构函数,再调用父类的析构函数
3.(父类析构函数不是虚函数)使用子类指针指向子类对象,那么会先调用子类析构函数,再调用父类析构函数
B 与 A 的关系符合 2,所以先调用 B 的析构再调用 A 的析构
A 与 parent_t 的关系符合 3,所以调用完 A 的析构会继续调用 parent_t 的析构