#include <iostream>
using namespace std;
class Car
{
public:
~Car() { cout << "Car is destructed." << endl; }
};
class Taxi :public Car
{
public:
~Taxi() {cout << "Taxi is destructed." << endl; }
};
void test(Car c) {}
int main()
{
Taxi taxi;
test(taxi);
return 0;
}
这是输出:
Car is destructed.
Car is destructed.
Taxi is destructed.
Car is destructed.
我使用MS Visual Studio Community 2017(对不起,我不知道如何查看Visual C ++版本)。当我使用调试模式时。我发现在void test(Car c){ }
按预期方式离开函数主体时执行了一个析构函数。而当一个额外的析构函数出现test(taxi);
结束了。
该test(Car c)
函数使用值作为形式参数。转到该功能时会复制汽车。因此,我认为离开该功能时只会有一辆“汽车被毁”。但是实际上在离开函数时有两个“汽车被破坏”。(输出中显示的第一行和第二行)为什么会有两个“汽车被破坏”?谢谢。
===============
例如,当我添加一个虚函数时class Car
:virtual void drive() {}
然后我得到了预期的输出。
Car is destructed.
Taxi is destructed.
Car is destructed.
Car
那么此问题将消失,并且可以得到预期的结果。
Taxi
获取Car
对象的函数时,编译器如何处理对象切片可能会引起问题?