眾所周知,不能在同壹個類中定義兩個名稱相同、參數個數和類型相同的函數,否則就是“重復定義”。然而,在類的繼承層次結構中,具有相同名稱、相同參數數量和類型但不同功能的函數可以出現在不同的級別中。例如,在示例12.1中(請參見:特定代碼的C++多態性的典型示例)。
程序,在Circle類中定義。
面積函數,面積函數也在Circle類的派生類Cylinder中定義。這兩個函數不僅名稱相同,而且參數數量也相同(都為0),但它們的函數卻不同。
相同,功能體不同。前者的作用是求圓形面積,後者的作用是求圓柱體的表面積。這是合法的,因為他們不在同壹個班級。
編譯系統根據同名覆蓋原則確定要調用的對象。示例12.1的程序中使用了Cy1.area()。
派生類Cylinder中的成員函數區域被調用。如果要調用cy1中的直接基類Circle的面積函數,應該表示為
cy1。Circle::area()。使用此方法區分同名的兩個函數。但是這樣做不方便。
人們提出了是否有可能以相同的調用形式同時調用同名的派生類和函數的想法。在程序中,不同派生層次結構中同名的函數不是由不同的對象名調用的,而是由指針調用的。例如,使用相同的語句“pt-》;顯示();“您可以在不同的派生級別中調用顯示函數,只需在調用之前為指針變量pt分配不同的值(使其指向不同的類對象)。
例如,如果妳要去壹個地方出差,如果妳乘坐公共汽車,妳必須提前確定妳的目的地,然後乘坐可以到達目的地的公共汽車線路。如果妳改乘出租車,會容易得多,而且妳不必檢查車道。
行,因為出租車可以去任何地方,上車後只需告訴司機暫時去哪裏。如果您想訪問多個目的地,只需在到達壹個目的地後告訴司機下壹個目的地即可。
然而,“打車”比坐公交車更方便。無論妳去哪裏都可以坐同壹輛出租車。這是壹個通過相同的形式可以達到不同目的的例子。
利用C++中的虛函數來解決這個問題。虛函數的作用是允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用訪問基類和派生類中同名的函數。