条款7 为多态基类声明virtual析构函数
例如设计一个记录时间的基类
class TimeKeeper
{
public:
TimeKeeper();
~TimeKeeper();
...
}
classs AtomicClock : public TimeKeeper{...};//原子钟
classs WaterClock: public TimeKeeper{...};//水钟
classs WristWatch: public TimeKeeper{...};//腕表
我们可以使用工厂返回一个计时对象,
TimeKeeper* getTimeKeeper();
...
delete ptk;
另外条款13说过:依赖客户执行的delete动作,基本上表带有某种错误倾向。(智能指针之后再说)
于是我们delete的只是AtomicClock 中TimeKeeper的部分,为了避免这样,我们需要在TimeKeeper中的析构函数声明为virtual
但是不想作为bass class的类,最好不用让其析构函数声明为virtual。
例如表示一个二维点:
class Point
{
public:
Point(int xCoord, int yCoord);
~Point();
private:
int x,y;
假如int占用32bits,Point对象可以放入一个64-bit的缓存器,可以传给例如C语言编写的函数中。
但是Point析构函数是一个virtual时,他将会有一个vptr,用来决定运行期哪一个virtual函数被调用,32-bit计算机体系中将占用到96bits!或者64bit计算机可能占用到128bits!这样对象大小就增大了50%-100%。
只有当class中至少含有一个virtual函数,才为他声明virtual析构函数