Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在虚拟析构函数的情况下,虚拟机制如何工作_C++_Virtual Destructor - Fatal编程技术网

C++ 在虚拟析构函数的情况下,虚拟机制如何工作

C++ 在虚拟析构函数的情况下,虚拟机制如何工作,c++,virtual-destructor,C++,Virtual Destructor,这里有人回答说,我们无法获取析构函数的函数指针 然后在下面的代码中说明虚拟机制是如何工作的。虚拟构造函数是否保存在虚拟表中??如果不是,那么在虚拟析构函数的情况下,虚拟机制是如何工作的 #include<stdio.h> class Base { public: Base() { printf("C-Base\n"); } virtual ~Base() { printf("Base\n");

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

#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()
{
printf(“C-Base\n”);
}
虚拟~Base()
{
printf(“Base\n”);
}
};
派生类:公共基
{
公众:
派生的()
{
printf(“C派生的\n”);
}
~Derived()
{
printf(“派生\n”);
}
};
int main()
{
Base*b=新派生的();
删除b;
}

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

仅仅因为您无法获得指向析构函数的指针,并不意味着编译器不能出于其自身的内部恶意目的


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

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


换句话说,就是你,无法获得这样一个指针。编译器本身在获取它时没有问题。Quod licet Iovi non licet bovi。

@Armen Tsirunyan:好的,但我看到两种拼写都在使用。>析构函数的多个版本<为什么?我只是curious@Roddy有很多原因可以解释为什么需要不止一个析构函数。第一:当一个类在某个地方有一个虚拟基时,只有最派生的类的析构函数才应该调用它的析构函数,因此将有两个析构函数:一个“完整对象析构函数”调用虚拟基的析构函数,另一个“子对象析构函数”不调用。第二:当一个类有一个重载运算符new和delete时,即使在通过基指针删除时,也必须使用该运算符delete来释放其内存。GCC通过为堆栈对象使用“非删除析构函数”和“删除析构函数”来实现这一点,后者基本上调用非删除析构函数,然后为完整对象调用正确的delete操作符。