代码之家  ›  专栏  ›  技术社区  ›  Bruce

如何在C++中实现构造函数和析构函数?

  •  0
  • Bruce  · 技术社区  · 15 年前

    我有两个类Base和Derived(从Base公开派生)。

    Derived * d1 = new Derived;
    delete d1;
    

    编译器发现d1是一个派生类型对象。因此它调用派生类构造函数(它调用基类构造函数)。我有两个问题-

    2) 这些构造函数如何协同工作来分配内存?我需要一些实施细节

    现在下一个语句是delete d1。因此编译器认为d1是一个派生类型对象,因此调用派生类的析构函数(在删除派生类成员后调用基类的析构函数)。我有一个问题-

    6 回复  |  直到 15 年前
        1
  •  1
  •   MSalters    15 年前

    (1) 基类不依赖于派生类,但反过来也是可能的。即a Base Derived 班上有,所以 Base::Base Derived::Derived 可以访问 Base::member 基::成员 之前 Derived::Derived gets the chance to use 基::成员“”。

    (2) 构造函数不分配内存。那是 new 的任务。或者,如果对象是全局对象,则编译器。构造函数是用 this

    对于基构造函数和派生构造函数,一个常见的实现在为派生构造函数生成的代码中插入对基构造函数的调用。对于单继承,基类和派生类通常共享同一个 指针,因此派生构造函数可以传递它得到的相同指针。

    [sic]就像构造函数不分配内存一样,析构函数也不会释放内存。这就是我们的任务 delete -同样,对于globals,编译器也会这样做。

        2
  •  2
  •   unwind    15 年前

    那代码无法编译。你不能 delete 自动实例,必须使用 new 分配实例以便使用 在上面。

    当谈到构造函数顺序时,我想运行它们是有意义的,这样更专门的类可以依赖于已经完成的更通用的部分。

        3
  •  2
  •   DevSolar    15 年前

    1) 默认情况下,会自动调用基类构造函数。但是,允许派生构造函数调用基类构造函数 在初始化列表中。如果构造函数不是首先执行派生类,这是不可能的。

    Derived::Derived() : foo( 42 ), bar( 7 ), Base( 1, 2 ) { }
    

    2) 编译器知道派生类的内存占用(因为所有成员变量在编译时都是已知的),并分配足够的内存来容纳基类和派生类成员。内存布局的详细信息由系统使用的ABI指定。

    3) 析构函数不仅仅是释放内存。事实上,毁灭者确实如此 指针 指向。

        4
  •  1
  •   Daniel Earwicker    15 年前

    delete 适用于指针,而不是对象。

    我认为C++本身(语言标准)不涉及如何使用内存来表示使用继承的类型的实例。然而,在大多数实现中,一个内存块是从空闲存储区分配的,这个存储区足够大,可以容纳所有的数据 Base Derived . 当一个 派生 则两个构造函数都运行,然后释放单个内存块。

    派生 是某个类的嵌入数据成员 Container ,然后是保存 容器 派生 (因此 底座 )所有其他的数据 .

        5
  •  0
  •   Stephane Rolland    15 年前

    构造时,从最高基类调用构造函数,直到派生最多的基类中的一个基类被称为最新基类。

    调用析构函数时,顺序相反。第一个被称为最派生的析构函数,直到最高基类之一。

        6
  •  0
  •   liaK    15 年前

    Base 类包括。它不能从类继承,因为它不知道。。 底座 Derived

    在破坏的情况下,如果 首先调用析构函数,然后被析构函数 类可能仍在使用基类成员,这将变得无效。。因此,破坏与结构正好相反。。