4

如何获取析构函数的成员函数指针?

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

#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;
 }

在这段代码中,如果我们在基类 Destructor 中不使用 virtual,则不会调用派生类的析构函数。

4

2 回答 2

10

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

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

于 2013-06-26T15:52:42.170 回答
5

仅仅因为不能得到指向析构函数的指针,并不意味着编译器不能用于它自己内部的、邪恶的目的。

(附带说明一下,编译器通常会生成多个版本的析构函数,在 vtable 中有多个条目,这使得它与普通函数指针不兼容。)

于 2013-06-26T15:52:14.393 回答