2
#include <iostream>
#include <string>

using namespace std;

class Person
{
    string name;

    public:
        Person():name("")
        {
            cout << "Person default ctor\n";
        }
        Person(const string& name_in):name(name_in)
        {
            cout << "Person string ctor: " << name << "\n";
        }
        ~Person()
        {
            cout << "Person dtor: " << name << "\n";
        }
        string get_name()
        {
            return name;
        }
};

class Professor:public Person
{
    int office;

    public:
        Professor(const string& name_in, int office_in):Person(name_in), office(office_in)
        {
            cout << "Professor string ctor: " << get_name() << endl;
        }
        ~Professor()
        {
            cout << "Professor dtro: " << get_name() << endl;
        }
};

int main()
{
    Person alice("Alice");
    Professor bob("Bob", 10);

    return 0;
}

出力は次のようになると思います。

Person string ctor: Alice

Person dtor: Alice

Professor string ctor: Bob

Professor dtor: Bob

それはプログラムの構造から論理的に続くべきであるように思われるので。ただし、実際の出力は次のとおりです。

Person string ctor: Alice

Person string ctor: Bob

Professor string ctor: Bob

Professor dtor: Bob

Person dtor: Bob

Person dtor: Alice

誰かがこれがなぜであるか説明できますか?間違った出力を思い付く原因となっているクラス/コンストラクタ/デストラクタについて理解していないことは何ですか?

4

3 に答える 3

6

まず第一に、Professorから派生しPersonます。これは、のすべてのインスタンスにProfessor暗黙的にのインスタンスが含まれていることを意味します(のコンストラクターでPersonどのように呼び出しているかを観察してください)。この暗黙のインスタンスは、オブジェクトが破棄されるときに自動的に破棄されます。Person(name_in)ProfessorProfessor

これはあなたが見る理由を説明しています:

Person string ctor: Bob
Person dtor: Bob

デストラクタ呼び出しの順序に関しては、変数は構築の逆の順序で破棄されます。これは、ボブがアリスの前に破壊される理由を説明しています。

Person string ctor: Alice
Professor string ctor: Bob
Professor dtor: Bob
Person dtor: Alice
于 2012-11-26T23:10:07.620 に答える
0

Professorは継承されているため、作成時に基本クラスのコンストラクターを呼び出します。person Bobそれが印刷される理由です。

逆破壊に関しては、これはオブジェクトが作成されたものと逆の順序で破壊されたためです。

于 2012-11-26T23:11:16.400 に答える
0

ProfessorはPersonであるため、Professorコンストラクターを呼び出すと、その基本クラスのコンストラクター(Person)が最初に呼び出されます。

破壊装置と似ていますが、順序が逆になっています。子クラスのデストラクタが最初に呼び出され、次に基本クラスが呼び出されます。

また、デストラクタは、オブジェクトが破棄されたときにのみ呼び出されます。これは、現在のスコープが終了したときにのみ発生します。

于 2012-11-26T23:16:07.413 に答える