用C ++扩展临时对象的生命周期

时间:2014-04-28 13:43:53

标签: c++

我正在阅读:http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

// Example 3

Derived factory(); // construct a Derived object

void g() {
  const Base& b = factory(); // calls Derived::Derived here
  // … use b …
} // calls Derived::~Derived directly here — not Base::~Base + virtual dispatch!

我理解第一个和第二个例子,但我没有看到第三个例子。 琐事,什么是引用/引用,什么是“虚拟派遣”。 这个例子很棒。

1 个答案:

答案 0 :(得分:1)

如果您编写如下代码:

void g() {
  Base* b = new Derived; // calls Derived::Derived here
  // … use b …
  delete b;
}

因为b的类型为Base *,所以基本析构函数是虚拟的,因为virtual dispatch派生的析构函数将被调用,因为基指针所指向的对象具有派生类型。

相反,如果您使用

void g() {
  Derived* d = new Derived; // calls Derived::Derived here
  // … use d …
  delete d;
}

无论基础析构函数是否为虚拟,都会调用派生的析构函数。不需要虚拟调度。

Writer要强调的是,在示例3中,如果base析构函数不是虚拟的,甚至,将调用派生的析构函数。因为没有调用析构函数,因为引用超出了作用域,但是因为基本引用不再需要临时对象(派生类型)。 (必须是const)