zoukankan      html  css  js  c++  java
  • 子类构造、析构时调用父类的构造、析构函数顺序

    子类构造、析构时调用父类的构造、析构函数顺序

    析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了。

    定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。

    原因:

    1. 派生类构造函数中的某些初始化可能是基于基类的,所以规定构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然后调用成员(此处的成员只指各种类对象如QString a,不含基本类型变量如int n、指针变量如QString *a)对象构造函数(因为C++的成员变量是不会自动初始化的,只能使用初始化列表初始化(调用成员的构造函数,如果不在初始化列表中显式调用的话,则会隐式调用成员变量的默认构造函数,通过汇编可以发现)或在本层构造函数内初始化)        参考:http://www.cnblogs.com/lidabo/p/3790606.html)。

    2. 如果没有显式调用基类的构造函数,会自动调用基类的无参构造函数。而如果基类只有带参数的构造函数,则会报错。不一定要显式的无参构造函数,可以显式调用基类带参数的构造函数。

    复制代码
    #include<iostream>
    using namespace std;
    class Base{
    public:
        Base(int c){cout<< "基类带参构造函数" << c << endl;}
        ~Base(){cout<<"基类析构" << endl;}
    };
    class Derived:public Base{
    public:
        Derived(int c):Base(c) // 显式调用基类构造函数
        {
            cout<< "派生类带参构造函数" << c << endl;
        }
        ~Derived(){cout<<"派生类析构" << endl;}
    };
    int main()
    {
        int i = 9;
        Derived d1(i);
        return 0;
    }
    复制代码

    输出结果:

    基类带参构造函数9

    派生类带参构造函数9

    派生类析构

    基类析构

    转自:http://zhidao.baidu.com/link?url=fdBaMWX2-7zCBRQDow9LtkNGa9rRnvz6rhybNxvRc1tP8Puhx4HeKPfrdLHETk3DyFjnSHDvhA1daydeTc0x4RF0458i_r_rOWFoH3N5JcG

  • 相关阅读:
    [dubbo实战] dubbo+zookeeper伪集群搭建
    Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
    Docker实践
    docke镜像上传到dockerhub仓库和阿里云docker仓库的方法
    Linux chmod命令详解
    使用nexus搭建maven私服
    Zookeeper注册节点的掉线自动重新注册及测试方法
    Dubbo负载均衡策略
    各种排序算法及其java程序实现
    java中的各种数据类型在内存中存储的方式
  • 原文地址:https://www.cnblogs.com/bdqczhl/p/14002005.html
Copyright © 2011-2022 走看看