#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)
函数使用值作为形参。
进入函数时会复制Car对象。
所以我认为,在离开函数时只会有一个"Car is destructed"。
但实际上,离开函数时会有两个"Car is destructed"。(如输出中的第一行和第二行)
为什么会有两个"Car is destructed"? 谢谢。
===============
当我在class Car
中添加了一个虚函数,
例如:virtual void drive() {}
然后我得到了预期的输出结果。
Car is destructed.
Taxi is destructed.
Car is destructed.
Taxi
对象按值传递给一个接受Car
对象的函数时,编译器如何处理对象切片可能会成为一个问题? - Some programmer dudeCar
添加一个用户定义的复制构造函数和默认构造函数,那么这个问题就会消失,并且它会给出预期的结果。 - interjay