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

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

先假設一個繼承的關係如下
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){}
只要這麼做,就可以使用有參數的基礎類別囉!基礎類別建構子中初始化過的變數,也就不用再貼過來衍生類別的建構子囉。

沒有留言:

張貼留言

(什麼是留言欄訊息?)