如何在以下程序中以私有方式调用派生类析构函数

How does the derived class destructor get invoked being private in the following program?

本文关键字:调用 方式 派生 析构函数 程序      更新时间:2023-10-16
#include<iostream>
class base
{
   public:
       virtual ~base(){std::cout << "basen";}
};
class derived : public base
{
   private:
        ~derived(){std::cout << "derivedn";} /* destructor is private */
};
int main()
{
      base *pt= new derived;
      delete pt;
}

上面的程序编译并运行良好。派生类析构函数如何被调用为私有?

这不仅会发生在析构函数中。

您可以使用私有函数覆盖任何虚拟公共函数。

#include<iostream>
class base
{
   public:
       virtual void x(){std::cout << "basen";}
};
class derived : public base
{
   private:
        void x(){std::cout << "derivedn"; base::x();}
};
int main()
{
      base *pt= new derived;
      pt->x(); //OK
      //((derived *)pt)->x();  //error: ‘virtual void derived::x()’ is private
      derived *pt2= new derived;
      //pt2->x();  //error: ‘virtual void derived::x()’ is private
      ((base *)pt2)->x(); //OK
}

这样做的好处/缺点是您必须使用指向 base 的指针来访问此方法。此功能是将公共 API 与自定义实现分离的方法之一。

因此,换句话说,您的析构函数被调用,因为它在 base 中被声明为公共的,并且您通过指向 base 的指针将其调用。

这可能令人惊讶,但如果你仔细想想,这是完全合乎逻辑的。

编译器看到的是删除指向基的指针,该指针具有可访问的析构函数。所以它没有理由抱怨你正在做的事情。偶然地,它是一个虚拟的析构函数,但这也不是值得抱怨的事情。

在运行时,将调用虚拟析构函数。由于事实证明指向基的指针实际上指向派生对象,因此需要首先调用派生构造函数。
"但那个是私人的!">你说。没错,但是,在运行时没有公共/私有的概念。所以,再一次,没有理由发生任何不好的事情。不会生成任何错误。

相关文章: