-1

このコードでDerivedクラスのデストラクタが呼び出されたのはなぜですか?

#include <iostream>

class Base
{
public:
   Base() { std::cout << "Base::Base() \n"; }
   ~Base() { std::cout << "Base::~Base() \n"; } 
};

class Derived : public Base
{
public:
   Derived() { std::cout << "Derived::Derived() \n"; }
   ~Derived() { std::cout << "Derived::~Derived() \n"; } 
};

Derived foo() { return Derived(); }

int main()
{
   const Derived& instance = foo();
}
4

2 に答える 2

3

より興味深いものにするために、変更された を検討してmainください。

const Base& instance = foo();

このコードは、 type の一時 ( によって返されるオブジェクトfoo) を作成しDerived、 type の定数参照にバインドすることでオブジェクトの有効期間を延長しますBase。一時オブジェクトの有効期間は、参照が範囲外になるまで延長され、その時点でオブジェクトが破棄されます。コードは大まかに次のように変換されます。

Derived __tmp = foo();
const Base& instance = __tmp;

参照を保持しているブロックの最後でinstance__tmp変数もスコープ外になり、削除されます。仮想デストラクタがなくても、適切なデストラクタが呼び出されることに注意してください(関数によって返される型) __tmpDerived

于 2012-09-05T17:42:45.070 に答える
3

このコードで Derived クラスのデストラクタが呼び出されたのはなぜですか?

で作成したDerivedインスタンスfoo()がメインプログラムの最後で範囲外になるためです。

#include <iostream>
using namespace std;

class Base {
public:
    Base() {
        std::cout << "Base::Base() \n";
    }
    ~Base() {
        std::cout << "Base::~Base() \n";
    }
};

class Derived: public Base {
public:
    int i;
    Derived() {
        i = 10;
        std::cout << "Derived::Derived() \n";
    }
    ~Derived() {
        i = 0;
        std::cout << "Derived::~Derived() \n";
    }
    int get() {
        return i;
    }
};

Derived foo() {
    return Derived();
}

int main() {
    const Derived& instance = foo();
    cout << instance.i << endl;
    return 0;
}

出力は次のとおりです。

Base::Base()
Derived::Derived()
10
Derived::~Derived()
Base::~Base()
于 2012-09-05T17:21:10.157 に答える