先看一个例子:
class EnemyTarget
{
public:
EnemyTarget() { ++numTargets; }
EnemyTarget(const EnemyTarget&) { ++numTargets; }
~EnemyTarget() { --numTargets; }
static size_t numberOfTargets()
{ return numTargets; }
virtual bool destroy(); // returns success of
// attempt to destroy
// EnemyTarget object
private:
static size_t numTargets; // object counter
};
// class statics must be defined outside the class;
// initialization is to 0 by default
size_t EnemyTarget::numTargets;
class EnemyTank: public EnemyTarget {
public:
EnemyTank() { ++numTanks; }
EnemyTank(const EnemyTank& rhs)
: EnemyTarget(rhs)
{ ++numTanks; }
~EnemyTank() { --numTanks; }
static size_t numberOfTanks()
{ return numTanks; }
virtual bool destroy();
private:
static size_t numTanks; // object counter for tanks
};
如果你要执行:
EnemyTarget *targetPtr = new EnemyTank;
...
delete targetPtr;
1,当你企图经由一个"base class pointer"删除一个"derived class object",而此base class有一个nonvirtual destructor,结果未定义.
将destructor声明Wievirtual可以确保其行为有良好定义,在内存释放之前,EnemyTarget和EnemyTank的destructor都会被调用.
2,如果class不含有任何virtual虚拟函数,往往意味着它不会被当做base class使用,此时令其destructor为virtual通常是个坏主意.
例如:
class Point {
public:
Point(short int xCoord, short int yCoord);
~Point();
private:
short int x, y;
};
此时Point对象可以塞进一个32-bit的缓冲器,甚至可以被当做一个32-bit数值.
而要实现虚函数,对象必须夹带一些额外信息,协助决定"哪一个虚函数应该被调用".
大部分编译器是以一个虚函数表指针来呈现这份额外信息,虚函数表指针指向一个虚函数表,内容为函数指针数组.
3,总结:只有当class内含有至少一个虚拟函数时,我们才将其destructor声明为virtual.
4,对有些classes,你既希望它们是抽象的,却又没有适当的函数可选作为pure virtual function,此时可以声明一个pure virtual destructor.
如:
class AWOV
{
virtual ~AWOV() = 0;
}
不过,你必须提供一个定义式:
AWOV:~AWOV(){}
因为派生类析构时,即便AWOV是个抽象类,~AWOV()最后还是会被调用.
因此,必须提供一个函数实体.
#include<iostream>
using namespace std;
class AWOV
{
public:
virtual ~AWOV() = 0;
};
AWOV::~AWOV(){}
class My : public AWOV
{
};
int main()
{
My m;
return 0;
}
否则编译无法通过:
undefined reference to `AWOV::~AWOV()'|
分享到:
相关推荐
条款14:明智运用 exception specifications 072 Use exception specifications judiciously 条款15:了解异常处理(exception handling)的成本 078 Understand the costs of exception handling 效率(Efficiency...
Java相关E:\JAVA\OO Project Instructor Guide(门诊模块).pdf E:\JAVA\OO Project Instructor Guide(门诊模块).pdf
CS224D: Deep Learning for NLP Course Instructor: Richard Socher Lecture Notes: Part III
The instructor's manual for the book C++ How to Program
这个是Instructors Manual, 可以看作是官方答案。
Instructor's Manual + Solutions
Cisco Packet Tracer 6.2 for Windows Instructor Version
这是英文原版《数据库原理》第3版的教师用书,包含课后习题的全部答案。
算法导论_Instructor's Manual(含部分答案
ENA 12.6 Instructor Guide
数据库系统概念-原书第六版,全部示例表、数据sql文件(如instructor,department建表sql和数据)。之前将实例数据表一行一行打字,搞了一天,后来找到全部的建表、数据初始化的sql文件,转给大家下载了,节省各位时间...
基于Cisco Packet Tracer Instructor软件实现的计算机网络实验(资源内是实验原文件)。 主要涵盖四种实验: 1、三层交换机实现VLAN间通信 实验设备:2台3560三层交换机,3台电脑。 实验要求:使在同一VLAN里的...
Instructor evaluation,希望能够帮助到你
VMware Lab Platform Instructor Guide
solutions to CSAPP homework
麻省理工学院 算法导论 Introduction.to.Algorithms Instructor.Manual
AIX 5L System Administration IIIPerformance Management Instructor Guide.pdf
算法导论的习题解答和教师手册(手册) Instructor's Manual of CLRS
英语讲师思科认证网络基础 解释终端用户设备和本地网络如何与全球互联网交互。 ●解释网络连接要求。 ©2019思科和/或其附属公司。版权所有。思科文件是公开的。共4页第2页 ●使用集成网络路由器构建小型网络。...
Notes to the user The training materials are not teach-yourself ... They complement the course instructor's explanations. On the sheets, there is space for you to write down additional information