• effective c++(07)之为多态基类声明virtual析构函数


    class TimeKeeper
    {
    public:
        TimeKeeper() ;
        ~TimeKepper() ;
        ...
    } ;
    class AtomicClock:public TimeKeeper{...}// 原子钟
    class WaterClock:public TimeKeeper{...}// 水钟
    class WristWatch:public TimeKeeper{...}// 腕表

    根据工厂模式,会返回一个base class指针指向新生成的derived class对象。

    TimeKeeper* getTimeKeeper() ;// 返回一个指针,指向一个TimeKeeper派生类的动态分配对象

    如果delete掉(如果不delete则有可能会造成内存或者其他资源泄露)返回的指针。如下:

    TimeKeeper* ptk = getTimeKeeper();// 从TimeKeeper继承体系获得一个动态内存分配对象。
    ...
    delete ptk ;// 释放它,避免资源泄露。

    此时如果基类有non-virtual析构函数,此时调用delete之后只销毁了base class,而derived class没有被销毁。解决方法是将base class的析构函数定义成virtual函数。此时会造成资源泄露,败坏数据结构,在调试器上浪费时间等现象。

    如果class中不含有virtual函数说明他不想做为一个基类。

    如果试图继承一个标准容器或者任何其他"non-virtual"析构函数的class,拒绝诱惑吧。。。

    对于pure virtual函数如下:

    class AWOV    // AWOV = "Abstract w/o Virtuals"
    {
    publicvirtual ~AWOV() = 0// 声明pure virtual析构函数
    } ;

    此时不必担心析构函数的问题,但必须要为~AWOV()函数提供一个定义,因为编译器会在AWOV的derived class中创建一个调用该函数的动作。

    结论:

    1. ploymorphic(多态) base classes应声明一个virtual析构函数。如果class带有任何virtual函数,他们就应该有一个virtual析构函数。

    2. class的设计目的如果不是作为base class 使用,或者不是为了具备多态性,就不能声明为virtual析构函数。

  • 相关阅读:
    JS之RegExp对象(一)
    八大排序算法总结
    mysql创建数据库指定编码格式
    Java学习笔记_22_Set接口的实现类
    HDU--杭电--3415--Max Sum of Max-K-sub-sequence--暴力或单调队列
    第六届蓝桥杯JavaB组省赛真题
    第六届蓝桥杯JavaA组省赛真题
    第六届蓝桥杯JavaA组省赛真题
    第六届蓝桥杯JavaA组省赛真题
    第六届蓝桥杯JavaA组省赛真题
  • 原文地址:https://www.cnblogs.com/2011winseu/p/3187244.html
Copyright © 2020-2023  润新知