我在接受采访时被问到这个问题.我无法在那里回答这个问题.我现在也无法得到它,为什么输出是这样的.这是代码:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void fun ( int x = 0)
{
cout << "Base::fun(), x = " << x << endl;
}
};
class Derived : public Base
{
public:
virtual void fun ( float x = 10.0 )
{
cout << "Derived::fun(), x = " << x << endl;
}
};
int main()
{
Derived d1;
Base *bp = &d1;
bp->fun();
d1.fun();
d1.fun(1.2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是:
Base::fun(), x = 0 …
Run Code Online (Sandbox Code Playgroud) 以下程序:
#include <iostream>
using namespace std;
class Test
{
public:
Test() { cout << "Constructor is executed\n"; }
~Test() { cout << "Destructor is executed\n"; }
};
int main()
{
Test(); // Explicit call to constructor
Test t; // local object
t.~Test(); // Explicit call to destructor
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印以下输出:
Constructor is executed
Destructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
Run Code Online (Sandbox Code Playgroud)
我的问题是即使在 main() 中显式调用析构函数之后,为什么编译器在退出 main() 之前隐式调用析构函数?
作为一个附带问题,除了在删除运算符中使用之外,是否还有其他使用显式调用析构函数的策略?