2
/* Problem 50 */
#include <iostream>
using namespace std;

class a {
    char ach;
  public:
    a(char c) { ach = c - 1; }
    ~a(); // defined below
    virtual void out(ostream &os) {
      if ('m' < ach)
        os << ach << char(ach+7) << char(ach+6) << ' ';
      else
        os << ach << ach << ach;
    }
};

class b: public a {
    char bach;
  public:
    b(char c1, char c2) : a(c1) { bach = c2-1; }
    void out(ostream &os) {
      a::out(os);
      os << ' ' << bach << char(bach + 11);
    }
};

ostream &operator<<(ostream &os, a &x) {
  x.out(os);
  return os;
}

a::~a() {
  cout << *this; // calls above operator
}

int main() {
  b var1('n', 'e');
  a var2('o');
  cout << "Homer says: " << var1 << '\n';
  return 0;
}

3つのオブジェクトが構築されているのに、なぜ2つのオブジェクトだけが破壊されているのか混乱しています

また、とcoutの各コンストラクトを付けて、コンストラクトの数を確認し、構築されたオブジェクトの数については正しかったのですが、破棄したときは間違っていました。base_classderived_class

誰かが私に最後の破壊が作成されている最初のオブジェクトに適用されなかった理由を指摘していただけますか?

4

4 に答える 4

6

構築されているオブジェクトは2つだけです。コンストラクターに表示される3つのcoutは、派生クラスオブジェクトを作成するときに、基本クラスコンストラクターが呼び出されるためです。class a補足として、デストラクタを仮想として宣言する必要があります。

于 2012-04-17T04:36:33.930 に答える
2

mainb var1('n', 'e');で最初のオブジェクトを作成する場合、つまりこのオブジェクトはクラスbコンストラクターによって構築され、コンストラクターb(char c1, char c2) : a(c1)も使用するように指示してclass aいる場合、この場合はすでに2つのコンストラクターを呼び出していることを意味します。最後のコンストラクターはこのオブジェクト用です。a var2('o');この場合、コンストラクターを使用していますclass a。したがって、合計で2つのコンストラクターclass aと1つのコンストラクターを使用しましたclass b。あなたは2つのオブジェクトを持っています、そしてあなたが2つのオブジェクトが破壊されているのを見る理由はあなたが持っている~a()が持っていないからです~b().

これが役立つことを願っています

于 2012-04-17T05:00:57.590 に答える
1

ネストで複数のオブジェクトが作成されている場合、それらは作成されたのとは逆の方法で破棄されます。例....クラス1オブジェクトが最初に作成され、次にこのクラス2内に作成され、次にそのクラス3内に作成された場合、クラス3オブジェクトは最初に破壊されるなど...フローが正しく行われているかどうかを確認してください...

于 2012-04-17T04:37:43.537 に答える
1

main()関数で作成されているオブジェクトは2つだけです。1つはvar1で、もう1つはvar2です。オブジェクトは参照によって渡されるため、オブジェクトのコピーが作成されることはありません。したがって、2つのオブジェクトのみが表示されるはずです。オブジェクトの1つは派生クラスであるため、コンストラクターが派生クラスと基本クラスの両方のコンストラクターのステートメントを出力するのを見るのは自然なことです。派生クラスのデストラクタを定義していないため、出力されません。印刷ステートメントの数をオブジェクトの数と誤解していると思いますが、これは派生クラスには当てはまりません。念のため、コンストラクタとデストラクタのすべてのprintステートメントに「this」のアドレスも出力してください。アドレスを確認し、オブジェクトが2つしかないことを確認します。

于 2012-04-17T04:43:44.927 に答える