我正在阅读: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!
我理解第一个和第二个例子,但我没有看到第三个例子。 琐事,什么是引用/引用,什么是“虚拟派遣”。 这个例子很棒。
答案 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)