zoukankan      html  css  js  c++  java
  • 析构函数为虚函数

    /*
    基类析构函数[是虚函数]:
        指向派生类的基类指针在析构的时候
        [普通指针,shared_ptr,unique_ptr][都会先调用派生类的析构函数,然后再调用基类的析构函数]
     */
    /*
    基类析构函数[不是虚函数]:
        指向派生类的基类指针在析构的时候
        [普通指针,unique_ptr][只会调用基类的析构函数,不会调用派生类的析构函数]
        [shared_ptr][会先调用派生类的析构函数,然后再调用基类的析构函数]
     */
    
    #include <iostream>
    #include <string>
    #include <memory>
    
    class BaseA
    {
        int data;
        std::string msg;
    public:
        BaseA() {
            msg="BaseA message";
        }
    
        /*
        ~BaseA() {
            std::cout<<__FUNCTION__<<std::endl;
        }
         */
        
        virtual ~BaseA() {
            std::cout<<__FUNCTION__<<std::endl;
        }
    
        virtual void show_msg() {
            std::cout<<msg<<std::endl;
        }
    };
    
    class DeriveA:public BaseA
    {
        int data;
        std::string msg;
    public:
        DeriveA() {
            msg="DeriveA message";
        }
    
        ~DeriveA() {
            std::cout<<__FUNCTION__<<std::endl;
        }
    
        
        void show_msg() {
            std::cout<<msg<<std::endl;
        }
    };
    
    void UsePrivateFunc() {
        {
            std::cout<<"ptr BaseA:"<<std::endl;
            BaseA* ptr_BaseA(new DeriveA());
            ptr_BaseA->show_msg();
            delete ptr_BaseA;
        }
        std::cout<<"
    ";
        
        {
            std::cout<<"unique_ptr BaseA:"<<std::endl;
            std::unique_ptr<BaseA> uptr_BaseA(new DeriveA());
            uptr_BaseA->show_msg();
        }
        std::cout<<"
    ";
        
        {
            std::cout<<"shared_ptr BaseA:"<<std::endl;
            std::shared_ptr<BaseA> sptr_BaseA(new DeriveA());
            sptr_BaseA->show_msg();
        }
    }
    
    int main(int argc,char* argv[])
    {
        UsePrivateFunc();
        return 0;
    }
    

    析构函数是虚函数的输出结果:

    析构函数不是虚函数的输出结果:

  • 相关阅读:
    IoT(Internet of things)物联网入门介绍
    SIP协议解析
    nginx内核优化参考
    下线注册中心微服务
    vscode配置vue+eslint自动保存去除分号,方法与括号间加空格,使用单引号
    linux常见故障整理
    部署Glusterfs
    解决 eslint 与 webstrom 关于 script 标签的缩进问题
    单个maven项目使用阿里云镜像方法
    idea启动tomcat日志乱码解决办法
  • 原文地址:https://www.cnblogs.com/smallredness/p/11019451.html
Copyright © 2011-2022 走看看