任何時候重新定義了基類中的一個重載函數,那么在新類中的所有其他版本將被自動隱藏。修改返回值和參數同樣會隱藏基類其他版本的函數,如果該函數是虛函數,不能在新類中修改返回值。
2. 自動類型轉換方法(該轉換只發生在函數調用期間)
1) 利用轉型構造函數
2) 利用運算符轉換
如果不想自動轉換,可將轉型構造函數利用explicit關鍵字設為顯式調用
class One
{
public:
One(){}
};
class Two
public:
explicit Two(const& One){}
};
void f(Two){}
int main()
{
One one;
f(one);// error
f(Two(one));//right
return 0;
}It's supposed to help with your complexion.
運算符轉換之前沒用到過,該方法的中心思想是,在該類中添加一個 operator Type()的函數,該函數沒有返回值,要從該類轉型到該Type類型的時候,編譯器會自動調用該成員函數,轉換成Type類型
class Four
{public:
operator Three() const
{
return Three(x);
}
};
g(Three){}
int main()
{
Four four;
g(four);//invoke four.Three(), there no return value
return 0;
}3. 拷貝構造函數和賦值操作符
子類如果沒有寫這兩個,編譯器將會自動生成,生成的代碼中調用父類的拷貝構造函數和賦值操作符,所以如果我們自己寫的話,最好也要調用父類的拷貝構造函數和賦值操作符。
因為構造函數和operator=和拷貝構造函數只負責初始化自己層次的構造,所以要完成初始化,必須先要初始化父類,所以他們不能被繼承。(其實沒理解這句話,如果被繼承了的話,那子類就可以負責完成父類的初始化了???)
一旦我們自己決定手動添加拷貝構造函數和operator=,編譯器會假定我們已經知道所作的一切,并且不再自動調用基類版本,如果想調用,必須我們自己添加,即初始化列表。
4. 多態的進化(為什么使用多態和怎么用)
....
1





One()