C++當子類的成員函數與父類的成員函數重名時:
若父類沒有virtual聲明,子類函數可以和父類函數返回值不同,但函數名和參數列表必須相同.
則子類實例通過"."調用的是子類的函數
若子類想調用父類的函數,則需要使用 子類實例.父類::函數名() 的形式.
父類實例通過"."調用的是父類的函數
父類無法調用子類的同名函數
若通過指針->調用
則指針的類型 決定 調用哪個類的函數
父類地址強制轉換為子類指針 也可以調用子類的函數.
若父類有virtual聲明,
虛函數就固定了函數的形式,所以子類函數和父類函數的返回類型也必須一致,否則報error: conflicting return type specified for ‘virtual int CDerive::show()’
則通過"."調用時,
子類實例調用子類函數,父類實例調用父類函數.
若通過"->"調用時,
則多態性成立,即當使用基類指針通過->調用時,根據指針的內容確實是基類地址還是子類地址,分別調用對應的函數.子類地址賦給父類指針,默認調用的是子類的函數,但可以通過 父類指針->父類::函數名() 明確調用父類的函數.
當用子類指針通過->調用時,將父類地址強制轉換為子類指針,則默認調用的仍然是其本質的函數 即 父類的函數 可以通過 子類指針->子類名::函數名() 強制調用子類的函數.
將子類指針指向子類實例地址時,默認調用子類函數,可以通過 子類指針->父類名::函數名() 強制調用父類的函數.
當參數不一樣時,則是兩個函數,
此時通過->調用函數 取決於指針變量的類型決定調用哪個函數 而與其實質值無關.
子類類型的指針可以通過 子類指針->父類名::函數名() 強制調用父類函數.