C++接口类析构的疑问

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.9k
1 个回答

1.(父类析构函数不是虚函数)使用父类指针指向子类对象,析构该子类对象时,只会调用父类析构函数
2.(父类析构函数是虚函数)使用父类指针指向子类对象,析构该子类对象时,会先调用子类的析构函数,再调用父类的析构函数
3.(父类析构函数不是虚函数)使用子类指针指向子类对象,那么会先调用子类析构函数,再调用父类析构函数

B 与 A 的关系符合 2,所以先调用 B 的析构再调用 A 的析构
A 与 parent_t 的关系符合 3,所以调用完 A 的析构会继续调用 parent_t 的析构

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题