Contact me:

C++ 子类构造函数初始化列表与基类关系

抽象基类的派生子类构造函数按照初始化列表的写法怎么也写不对,查资料后记录

要点如下

  1. 公有类型派生类不能访问基类私有成员

    --但我这里基类没有private成员

  2. 为什么要调用父类的构造函数?

    构造函数用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。*

  3. 派生类构造函数
    在创建派生类对象时,先调用基类的构造函数,然后调用派生类的构造函数;撤销对象时,析构函数被调用的顺序则相反。

  4. 若派生类中包含对象成员,则派生类的构造函数初始化成员列表中既要列出基类的构造函数也要列出对象的构造函数。派生类定义对象时,先调用基类的构造函数,再调用对象的构造函数,最后调用派生类的构造函数。

#pragma once
#include<iostream>
#include<string>
using namespace std;

//职工抽象基类
class Worker
{
public:
	Worker(){}
	Worker(int id, string name, int dId):m_Id(id),m_Name(name),m_DeptId(dId){}
	int m_Id; //职工编号
	string m_Name; //职工姓名
	int m_DeptId; //职工所在部门名称编号
};

正确

//派生 老板类
class Boss :public Worker
{
public:
	Boss(int id, string name, int dId):Worker(id,name,dId)
	{
		/*this->m_Id = id;
		this->m_Name = name;
		this->m_DeptId = dId;*/
	}
};

错误

//派生 老板类
class Boss :public Worker
{
public:
	Boss(int id, string name, int dId):id(m_Id),name(m_Name),dId(m_DeptId)	 	
        {}
//派生类的构造函数的初始化列表可以包含基类的构造函数、派生类成员的初始化,但是不能有基类成员的初始化!
};

reference

https://blog.csdn.net/libaineu2004/article/details/19565229

posted @ 2021-12-12 09:57  impwa  阅读(1679)  评论(0编辑  收藏  举报