【发布时间】:2018-01-10 10:33:25
【问题描述】:
官方解释的虚函数是:
虚函数是您希望在派生类中重新定义的成员函数。当您使用指针或对基类的引用来引用派生类对象时,您可以为该对象调用虚函数并执行派生类的函数版本。
请先看代码:
#include<iostream>
using namespace std;
class A
{
public:
A(){cout << "A()" << endl;}
~A(){cout << "~A()" << endl;}
};
class B:public A
{
public:
B(): A(){cout << "B()" << endl;}
~B(){cout << "~B()" << endl;}
};
int main()
{
A * pt = new B;
delete pt;
}
输出是:
A()
B()
~A()
我的问题是:
- 基类的析构函数不能被派生类继承,为什么我们要把基类的析构函数设为虚函数?
- 对于上面的代码,我知道这会导致问题(这里没有调用 B 类的析构函数)。我从 google 和 stackoverflow 搜索了很多文章或问题,所有这些都告诉我 base 的析构函数应该是虚拟的,但是析构函数的“虚拟”如何工作?我的意思是,有/没有“虚拟”析构函数的核心代码级别有什么区别?
【问题讨论】:
-
“基类的析构函数不能被派生类继承” - 顺便说一句,你为什么这么认为?
-
如果您的派生类析构函数是虚拟的,那么对象将按顺序被解构(首先是派生对象,然后是基类)。如果你的派生类析构函数不是虚拟的,那么只有基类对象会被删除
-
你熟悉 vtables 吗? stackoverflow.com/a/99341/951890
-
@Hariom Singh,您所说的只是告诉我们这种现象,但没有解释原因。这就是我发布问题的原因。
-
在这种情况下,析构函数中的
virtual与virtual函数没有什么不同:它只是确保调用了实际对象实例的析构函数。什么让你感到困惑?
标签: c++ undefined-behavior delete-operator vtable virtual-destructor