本文作者:kris

mysql派生表(Derived Table)简单用法实例解析-

kris 2025-01-19 03:58:41 3
mysql派生表(Derived Table)简单用法实例解析-摘要: 虚析构函数与非虚析构函数哪里不一样?把你的问题整理一下如下:这个时候我delete 执行父类的指针又会发生什么呢?C++中明确指出,当派生类对象经由一个基类指针被删除,而此基类仅提...

虚析构函数与非虚析构函数哪里不一样?

把你的问题整理一下如下:

mysql派生表(Derived Table)简单用法实例解析-

这个时候我delete 执行父类的指针又会发生什么呢?

C++中明确指出,当派生类对象经由一个基类指针被删除,而此基类仅提供了non-virtual析构函数,其结果是未定义的。如果删除基类指针,则需要运行基类构造函数并清除基类的成员,如果对象实际是指向派生类类型的对象,则没有定义这种行为。

实际执行是通常发生的是对象的derived成分没有被销毁(不同的编译器实现可能不同),而派生类中的base class成分通常会被销毁,这就造成了一个“局部销毁”的对象,从而造成资源泄露。

在Meyers的《Effective C++》《More Effective C++》中都提到过virtual析构函数,消除这个问题很简答:给base class一个virtual析构函数,这会保证运行适当的析构函数。

mysql派生表(Derived Table)简单用法实例解析-

Now,现在就有这样一个问题,是不是要把所有的class的析构函数都要带上virtual呢,这同样是错误的。要实现virtual函数,对象必须携带某些信息,主要用来在运行时决定哪一个virtual函数应该被调用。这份信息通常是由一个所谓vptr(virtual table pointer)指针指出。vptr指向一个由函数指针构成的数组,成为vtbl(virtual table);每一个带有virtual函数的class都有一个相应的vtbl。当对象调用一个virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vtbl,编译器在其中寻找适当的函数指针。当然在Scott Meyers的另一本书《More Effective C++》中有详细的介绍,同时尝试实现虚函数机制。virtual函数的实现细节并不重要,重要的是如果class中含有virtual函数,其对象的体积会增加,这会带来许多麻烦问题。

文章版权及转载声明

作者:kris本文地址:https://www.damoyx.com/p/24786.html发布于 2025-01-19 03:58:41
文章转载或复制请以超链接形式并注明出处大漠游侠网

阅读
分享