zoukankan      html  css  js  c++  java
  • C++学习基础十——子类构造函数与析构函数的执行

    1.子类构造函数的执行:

    先执行父类的构造函数,再执行成员对象的构造函数,最后执行自身的构造函数。

    当继承多个类时,构造函数的 执行顺序与继承时的顺序 相同,而与子类构造函数调用父类构造函数的顺序无关。

     

    2.子类析构函数的执行:

    先执行自身析构函数,再执行成员对象的析构函数,最后执行父类的析构函数 。

    当继承多个类时,父类析构函数的执行过程与构造函数的执行过程相反

     

    3.代码如下:

      1 #include <iostream>
      2 #include <string>
      3 
      4 using namespace std;
      5 //子类构造函数的执行过程:先执行父类的构造函数,再执行成员对象的构造函数,最后执行自身的构造函数
      6 //当继承多个类时,构造函数的 执行顺序与继承时的顺序 相同,而与子类构造函数调用父类构造函数的顺序无关
      7 //子类析构函数的执行过程:先执行自身析构函数,再执行成员对象的析构函数,最后执行父类的析构函数 
      8 //当继承多个类时,父类析构函数的执行过程与构造函数的执行过程相反 
      9 
     10 class Base1
     11 {
     12 public:
     13     Base1(int k)
     14     {
     15         a = k;
     16         cout<<"Base1的构造函数被调用...."<<endl;
     17     }    
     18     void test()
     19     {
     20         cout<<a<<endl;
     21     }
     22     ~Base1()
     23     {
     24         cout<<"Base1的析构函数被调用...."<<endl;
     25     }
     26 private:
     27     int a;
     28 };
     29 
     30 class Base2
     31 {
     32 public :
     33     Base2(int k)
     34     {
     35         b = k;
     36         cout<<"Base2的构造函数被调用...."<<endl;
     37     }
     38     void test()
     39     {
     40         cout<<b<<endl;
     41     }
     42     ~Base2()
     43     {
     44         cout<<"Base2的析构函数被调用...."<<endl;
     45     }
     46 private:
     47     int b;    
     48 };
     49 
     50 class Base3
     51 {
     52 public:
     53     Base3()
     54     {
     55         c = 0;
     56         cout<<"Base3的默认构造函数被调用...."<<endl;
     57     }
     58     void test()
     59     {
     60         cout<<c<<endl;
     61     }
     62     ~Base3()
     63     {
     64         cout<<"Base3的析构函数被调用...."<<endl;
     65     }
     66 private:
     67     int c;    
     68 };
     69 
     70 class Demos
     71 {
     72 public:
     73     Demos(int k)
     74     {
     75         m = k;
     76         cout<<"Demos的构造函数被调用...."<<endl;
     77     }
     78     int getM()
     79     {
     80         return m;
     81     }
     82     ~Demos()
     83     {
     84         cout<<"Demos的析构函数被调用...."<<endl;
     85     }
     86 private:
     87     int m;    
     88 };
     89 
     90 class son:public Base1,public Base3,public Base2
     91 {
     92 public:
     93     son(int a,int b,int c,int l);
     94     void test();
     95     ~son();
     96 private:
     97     int s;
     98     Demos d;
     99 };
    100 
    101 son::son(int a,int b,int c,int l):Base1(a),Base2(b),s(c),d(l)
    102 {
    103     cout<<"son的构造函数被调用...."<<endl;
    104 }
    105 
    106 void son::test()
    107 {
    108     Base1::test();
    109     Base2::test();
    110     Base3::test();
    111     cout<<s<<endl;
    112     cout<<d.getM()<<endl;
    113 }
    114 son::~son()
    115 {
    116     cout<<"son的析构函数被调用...."<<endl;
    117 }
    118 
    119 int main()
    120 {
    121     cout<<"======子类构造函数的执行过程    start====="<<endl;
    122     son son(1,2,3,4);
    123     cout<<"======子类构造函数的执行过程    end====="<<endl;
    124     son.test();
    125     
    126     cout<<"
    ======子类析构函数的执行过程   ====="<<endl;
    127     return 0;
    128 }

    执行结果如下图所示:

  • 相关阅读:
    豆瓣最佳影评-星级转换
    佛山链家-bs修改网页代码难题-待突破
    爬取学校官网新闻-bs与xpath的恩怨情仇
    猫眼电影评论(1366错误)-版本一
    books新手实践xpath
    scrapy项目入门--shell的使用!
    selenium模拟浏览器进行百度搜索
    在VM中安装CentOs后无法切换到root用户
    VMware安装Linux虚拟机(手动划分分区)(CentOS为例)详细图解
    JDBC连接数据库 mysql serverTimezone 时差问题
  • 原文地址:https://www.cnblogs.com/calence/p/5890968.html
Copyright © 2011-2022 走看看