zoukankan      html  css  js  c++  java
  • 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析构函数。

  • 相关阅读:
    连接ESP32失败:等待包头 #226超时
    题王网
    高可用架构模式——CAP
    高性能负载均衡
    单服务器高性能模式
    虚拟支付
    高性能架构设计——数据库篇
    MySQL
    shell 命令: MD5
    HTTPS
  • 原文地址:https://www.cnblogs.com/2011winseu/p/3187244.html
Copyright © 2011-2022 走看看