#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){ }
関数本体を期待どおりに残すと、1つのデストラクタが実行されます。そして、test(taxi);
が終わると追加のデストラクタが現れました。
test(Car c)
関数は、仮パラメータとして値を使用しています。関数に行くと車がコピーされます。そのため、機能を離れる際に「車が破壊される」のは1つだけになると思いました。しかし、実際には、関数を終了するときに「Car is destructed」が2つあります(出力に示されている1行目と2行目)。なぜ「Car is destructed」が2つあるのですか?ありがとうございました。
===============
class Car
たとえば、仮想関数を追加するとvirtual void drive() {}
、期待した出力が得られます。
Car is destructed.
Taxi is destructed.
Car is destructed.
Car
、この問題はなくなり、期待どおりの結果が得られます。
Taxi
ある可能性がありCar
ますか?