有參數的衍生類別建構子,呼叫有參數的基礎類別建構子

  1. 有參數的衍生類別建構子,呼叫有參數的基礎類別建構子

有參數的衍生類別建構子,呼叫有參數的基礎類別建構子

原文連結: https://darkblack01.blogspot.com/2015/05/blog-post.html
移植時的最後更新日期: 2015-12-23T14:16:57.650+08:00

這次要講的是「有參數的衍生類別建構子,呼叫有參數的基礎類別建構子」(有點長)

先假設一個繼承的關係如下

class Base
{
protected:
const string m_IniFilePathName;
public:
Base(const string& iniFilePathName): m_IniFilePathName(iniFilePathName){}
private:
Base(){};
};

class Derivative : public Base
{
public:
Derivative(const string& iniFilePathName);
};
在這個時候,Derivative 的建構式要怎麼設計呢?
下列來介紹幾種常見卻不可行的做法
Derivative::Derivative(const string& iniFilePathName): m_IniFilePathName(iniFilePathName){}
這樣會因為「m_IniFilePathName沒有在Derivative 宣告」而失敗。
Derivative::Derivative(const string& iniFilePathName)
{
m_IniFilePathName = iniFilePathName;
}
這樣會除了上述的問題之讓,還會因為m_IniFilePathName 是const而「無法進行賦值,只能初始化」而失敗。

而且這樣設計還有一個重點,就是無法不初始化基礎類別(Base)。
因為Derivative的建構子會預設使用Base的無參數建構子。
但是在此Base的無參數建構子設成private,所以就算Derivative放棄用參數建構也是不行。

真正要解決這件事怎辦?
Derivative::Derivative(const string& iniFilePathName): Base(iniFilePathName){}
只要這麼做,就可以使用有參數的基礎類別囉!基礎類別建構子中初始化過的變數,也就不用再貼過來衍生類別的建構子囉。