繁体   English   中英

C ++析构函数继承

[英]C++ Destructor inheritance

/* 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 ,看看有多少是构造的,我对构造对象的数量是正确的,但是当我做破坏时我错了。

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

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

当你在主b var1('n', 'e');中创建第一个对象时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使用class a 1个构造函数。 你有两个对象,你看到2个对象被破坏的原因是因为你有一个~a()但你没有~b().

希望这会有所帮助

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM