Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206848
  • 博文数量: 38
  • 博客积分: 2060
  • 博客等级: 大尉
  • 技术积分: 388
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-17 10:10
文章分类

全部博文(38)

文章存档

2011年(1)

2009年(37)

我的朋友

分类: C/C++

2009-08-12 15:00:48

先看如下一段程序:
 

#include <iostream>
using namespace std;

class A1
{
        private:
        int m;
        public:
        A1(int i)
        {
                m = i;
                cout<<"A1 constructor. "<<m<<endl;
        }
        ~A1()
        {
                cout<<"A1 destructor. "<<m<<endl;
        }
};
class A2
{
        private:
        int m;
        public:
        A2(int i)
        {
                m = i;
                cout<<"A2 constructor. "<<m<<endl;
        }
        ~A2()
        {
                cout<<"A2 destructor. "<<m<<endl;
        }
};
class A3
{
        private:
        int m;
        public:
        A3()
        {
                cout<<"A3 constructor. "<<m<<endl;
        }
        ~A3()
        {
                cout<<"A3 destructor. "<<m<<endl;
        }
};

class B:public A2,public A1,public A3
{
        A1 a1;
        A2 a2;
        A3 a3;
        public:
        B(int a,int b,int c,int d):A2(b),A1(a),a1(c),a2(d)
        {
                cout<<"B constructor. "<<endl;
        }
        ~B()
        {
                cout<<"B destructor. "<<endl;
        }
};

int main()
{
        B *b = new B(1,2,3,4);
        delete b;
}

 

执行结果如下:

A2 constructor. 2
A1 constructor. 1
A3 constructor. 0 //windows下这是一随机树目,linux下为0,原因在于g++会自动把未初始化的变量初始化为0;
A1 constructor. 3
A2 constructor. 4
A3 constructor. 0 //同上
B constructor.
B destructor.
A3 destructor. 0 //同上
A2 destructor. 4
A1 destructor. 3
A3 destructor. 0 //同上
A1 destructor. 1
A2 destructor. 2

总结如下:

  • 当定义一个子类对象时,首先调用其基类构造函数,再调用子类构造函数,接着再初始化成员变量。
  • 如果有多个基类,则按继承顺序调用其构造函数。
  • 析构函数的调用过程与构造函数相反。
阅读(2193) | 评论(0) | 转发(0) |
0

上一篇:互斥锁以及条件变量

下一篇:一个string类

给主人留下些什么吧!~~