• 类的继承之构造函数和析构函数的顺序


    #include <iostream>
    
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    class someThing
    {
        public:
            someThing(){std::cout << "someThing's construction function" << std::endl;}
            ~someThing(){std::cout << "someThing's destructor function" << std::endl;}
    };
    class parent
    {
        public:
            parent(){std::cout << "parent's construction function" << std::endl;}
            ~parent(){std::cout << "parent's destructor function" << std::endl;}    
    };
    
    class child : public parent
    {
        public:
            child(){std::cout << "child's construction function" << std::endl;}
            ~child(){std::cout << "child's destructor function" << std::endl;}
        private :
        someThing nameChild;    
    };
    
    int main(int argc, char** argv) 
    {
        child myChild;
            
        return 0;
    }

    结果是:

    parent's construction function
    someThing's construction function
    child's construction function
    child's destructor function
    someThing's destructor function
    parent's destructor function

    可见构造函数是从父类开始的,然后才是子类的构造函数。

    析构函数刚好相反

    这里存在一个问题就是:当我们声明一个指向parent的指针访问chlid的对象并且删除这个指针的时候就会发现,出问题啦!

    parent* myChlid = new child;
    delete myChlid;

    结果是:

    parent's construction function
    someThing's construction function
    child's construction function

    parent's destructor function

    因为当我们delete一个指针时,他是仅仅delete指向的那个类,这使得整个析构函数调用链断了。怎么解决这个问题呢?

    我们只需要使得每个析构函数为virtual即可

    virtual ~someThing(){std::cout << "someThing's destructor function" << std::endl;}

    virtual ~parent(){std::cout << "parent's destructor function" << std::endl;}

    virtual ~child(){std::cout << "child's destructor function" << std::endl;}

    这样的话就可以得到我们期望的结果:

    parent's construction function
    someThing's construction function
    child's construction function
    child's destructor function
    someThing's destructor function
    parent's destructor function

    最够贴上完整的代码:

    #include <iostream>
    
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    class someThing
    {
        public:
            someThing(){std::cout << "someThing's construction function" << std::endl;}
            virtual ~someThing(){std::cout << "someThing's destructor function" << std::endl;}
    };
    class parent
    {
        public:
            parent(){std::cout << "parent's construction function" << std::endl;}
            virtual ~parent(){std::cout << "parent's destructor function" << std::endl;}    
    };
    
    class child : public parent
    {
        public:
            child(){std::cout << "child's construction function" << std::endl;}
            ~child(){std::cout << "child's destructor function" << std::endl;}
        private :
        someThing nameChild;    
    };
    
    int main(int argc, char** argv) 
    {
        parent* myChlid = new child;
        delete myChlid;
            
        return 0;
    }

    结果是:

    parent's construction function
    someThing's construction function
    child's construction function
    child's destructor function
    someThing's destructor function
    parent's destructor function
  • 相关阅读:
    为什么你不会redis分布式锁?因为你没看到这篇文章
    JavaScript最佳做法—创建对象
    js构造函数的定义
    作用域和闭包
    js中的call()和apply()的区别
    3种方法快速查找两个数组是否在Javascript中包含任何公共项
    JavaScript继承的6种方式以及它们的优缺点
    JS常见的内存泄漏及可用的解决方法
    Vuex简单入门
    如何使用HTML和CSS为背景创建Wave图片?
  • 原文地址:https://www.cnblogs.com/boost/p/10339508.html
Copyright © 2020-2023  润新知