先看一个例子:
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
《C++ How To Program (Instructor's Manual)》是一本为教授C++编程语言而编写的教师指南。这本书是《C++ How to Program》的第三版的配套教学手册,由Deitel、Deitel & Nieto合作编写,由Deitel & Associates, Inc....
Instructor's Manual是配套的教学指南,包含了对书中习题的解答,对于学习者来说是极其宝贵的资源。 这本书涵盖了许多关键的计算机科学概念,包括: 1. **二进制和数字系统**:介绍二进制、十六进制和八进制表示法...
Cisco Packet Tracer 6.2 for Windows Instructor Version
这个是Instructors Manual, 可以看作是官方答案。
VMware Lab Platform Instructor Guide VMware Lab Platform Instructor Guide 是一份关于 VMware Lab Platform 的指南,旨在帮助指导教师使用该平台进行教学和实验室管理。下面是该指南中所涉及的一些重要知识点:...
* Instructor:讲师 * Tutor:个人辅导 * Supervisor:管理人 建筑物相关词汇 * Canteen:餐厅 * Cafeteria:自助餐厅 * Administration building:行政大楼 * Main building:主楼 * Wing/annex:配楼 * Teaching...
Instructor's Manual + Solutions
这是英文原版《数据库原理》第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,希望能够帮助到你
AIX 5L System Administration IIIPerformance Management Instructor Guide.pdf
算法导论的习题解答和教师手册(手册) Instructor's Manual of CLRS
Instructor's Manual是该书的教师指南,提供了课程教学的详细指导和支持。下面将详细阐述这本书中的关键知识点。 1. **算法基础**:算法是解决问题或执行任务的明确步骤序列,是计算机科学的核心。书中首先介绍了...
英语讲师思科认证网络基础 解释终端用户设备和本地网络如何与全球互联网交互。 ●解释网络连接要求。 ©2019思科和/或其附属公司。版权所有。思科文件是公开的。共4页第2页 ●使用集成网络路由器构建小型网络。...