【问题标题】:C++ Destructor inheritanceC++ 析构函数继承
【发布时间】:2012-04-28 10:19:22
【问题描述】:
/* 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;
}

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

我还在base_classderived_class 上的每个构造上添加了cout,以查看构造对象的数量,我对构造对象的数量是正确的,但是当我这样做时我错了破坏。

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

【问题讨论】:

    标签: c++ inheritance destructor


    【解决方案1】:

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

    【讨论】:

    • 感谢您提供的信息!实际上,这是我的教授为我们的考试做准备的。
    【解决方案2】:

    当您在主 b var1('n', 'e'); 中创建第一个对象时,这意味着该对象将由 b 类构造函数 b(char c1, char c2) : a(c1) 构造,并且您告诉它也使用 class a 构造函数,这意味着您已经拥有在这种情况下调用了 2 个构造函数。最后一个构造函数是用于这个对象a var2('o');,在这种情况下,您使用的是class a 中的构造函数。因此,您总共在class a 中使用了2 个构造函数,在class b 中使用了1 个构造函数。 你有 2 个对象,你看到 2 个对象被破坏的原因是因为你有一个 ~a() 但你没有 ~b().

    希望这会有所帮助

    【讨论】:

    • 感谢您的深入回答,我刚刚尝试创建 ~b(),是的,它要求再次破坏!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-11-14
        • 2021-04-13
        • 2011-12-31
        • 2011-10-14
        • 2023-03-30
        • 2011-04-04
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        相关资源
        最近更新 更多