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;
}

我很困惑为什么只有两个对象被破坏而三个对象被构造

我还把cout每个构造都放在了base_class和上derived_class,看看有多少是构造的,我对构造对象的数量是正确的,但是当我做破坏时我错了。

如果有人可以请指出为什么最后一个破坏不适用于正在创建的第一个对象?

4

4 回答 4

6

只构造了两个对象,您在构造函数中看到的 3 个 couts 是因为当您创建派生类对象时,会调用基类构造函数。作为旁注,您需要将class a析构函数声明为虚拟的。

于 2012-04-17T04:36:33.930 回答
2

当您在 main 中创建第一个对象时,b 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

如果在嵌套中创建了多个对象,那么它们将以与创建它们的方式相反的方式被销毁.. 示例.. 如果首先创建 class1 对象,然后在这个 class2 内部,然后在该 class3 内部.. 那么 class 3 对象将首先被销毁等等......所以试着看看你的流程是否正确......

于 2012-04-17T04:37:43.537 回答
1

我看到 main() 函数中只构造了两个对象。一个是 var1,另一个是 var2。虽然对象是通过引用传递的,所以不会构造任何对象的副本。所以你应该只看到 2 个对象。由于其中一个对象是派生类,因此很自然地会看到派生类和基类构造函数的构造函数打印语句。您还没有为派生类定义析构函数,因此它没有打印它。我认为您将打印语句的数量误读为对象的数量,对于派生类而言并非如此。对于 calrity,还要在构造函数和析构函数的所有打印语句中打印“this”的地址。查看地址并确认只有两个对象。

于 2012-04-17T04:43:44.927 回答