C++入门经典-例8.2-构造函数的访问顺序

1:父类和子类中都有构造函数和析构函数,那么子类对象在创建时是父类先进行构造还是子类先进行构造?同样,在子类对象释放时,是父类先进行释放,还是子类先进行释放?这都是有先后顺序的。答案是当从父类派生一个子类并声明一个子类的对象时,它将先调用父类的构造函数,然后调用当前类的构造函数来创建对象;在释放之类对象时,先调用的是当前类的析构函数,然后是父类的析构函数。

2:实例代码如下:

// 8.2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
class CEmployee                                    //定义CEmployee类
{
public:
    int m_ID;                                        //定义数据成员
    char m_Name[128];                                //定义数据成员
    char m_Depart[128];                                //定义数据成员
    CEmployee()                                    //定义构造函数
    {
        cout << "CEmployee类构造函数被调用"<< endl;    //输出信息
    }
    ~CEmployee()                                    //析构函数
    {
        cout << "CEmployee类析构函数被调用"<< endl;    //输出信息
    }
};
class COperator :public CEmployee                        //从CEmployee类派生一个子类
{
public:
    char m_Password[128];                            //定义数据成员
    COperator()                                    //定义构造函数
    {
        strcpy(m_Name,"MR");                        //设置数据成员
        cout << "COperator类构造函数被调用"<< endl;        //输出信息
    }
    ~COperator()                                    //析构函数
    {
        cout << "COperator类析构函数被调用"<< endl;        //输出信息
    }
};
int main(int argc, char* argv[])                            //主函数
{
    COperator optr;                                    //定义一个COperator对象
    return 0;
}
View Code

运行结果:

C++入门经典-例8.2-构造函数的访问顺序

3:在分析完对象的构建、释放过程后,会考虑这样一种情况:定义一个一个基类类型的指针,调用子类的构造函数为其构建对象,当对象释放时,需要调用父类的析构函数还是先调用子类的西沟函数,然后再调用父类的析构函数?答案是如果西沟函数时虚函数,就先调用子类析构函数,然后再调用父类的析构函数;如果西沟函数不是虚函数,就只调用父类的西沟函数。可以想像,如果在子类中为某个数据成员在堆中分配了空间,父类中的析构函数不是虚成员函数,将使子类的析构函数不被调用,导致内存泄漏。因此,在编写类的析构函数时,析构函数通常是虚函数。构造函数调用顺序不受基类在成员初始化表中是否存在以及被列出的顺序的影响。