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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM