虚拟析构函数的虚拟机制如何工作

时间:2013-06-26 15:48:23

标签: c++ virtual-destructor

How do I get the member function pointer of a destructor?

这里有人回答说我们无法获得析构函数的函数指针 那么虚拟机制如何在下面的代码中工作。虚拟构造函数是否保存在虚拟表中?如果不是那么虚拟机构在虚拟析构函数的情况下如何工作?

#include<stdio.h>
class Base
{
    public:
    Base()
    {
          printf("C-Base\n");
    }

    virtual ~Base()
    {
           printf("Base\n");
    }
 };

 class Derived:public Base
 {
     public:
     Derived()
    {
         printf("C-DErived\n");
     }
     ~Derived()
     {
         printf("DErived\n");
     }
 };

int main()
{

     Base *b=new Derived();
     delete b;
 }

在这段代码中如果我们不在Base类中使用虚函数析构函数派生类析构函数将不会被调用。

2 个答案:

答案 0 :(得分:9)

当有人说你无法获得指向析构函数的指针时,就意味着没有源代码级语法。但是在底层,析构函数仍然是一个普通的函数,它通常通过存储在虚拟表中的指针来访问。

换句话说,它具体是,谁也无法获得这样的指针。编译器本身在获取它时没有任何问题。 Quod licet Iovi non licet bovi

答案 1 :(得分:5)

仅仅因为无法获得指向析构函数的指针,并不意味着编译器无法为其内部,恶意目的而进行。

(作为旁注,编译器通常会生成多个版本的析构函数,在vtable中有多个条目,这使得它与普通函数指针不兼容。)