- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
14虚拟函数
12 虛擬函數 12.1 多載與超載 12-2 12.1.1 多載函數 12-2 12.1.2 超載函數 12-4 12.2 虛擬函數 12-6 12.2.1 同名異式 12-7 12.2.2 虛擬函數 12-9 12.2.3 基礎類別指標 12-11 12.2.4 虛擬物件指標 12-13 12.3 抽象類別 12-15 12.3.1 虛擬類別繼承 12-15 12.3.2 純虛擬函數 12-18 12.3.3 抽象基礎類別 12-19 12.1 多載與超載 多載(overloading)是在同一類別中,重複定義二個或多個名稱相同,但參數各數不同或參數型態不同的函數。 超載(overriding)則是在衍生類別中,重新定義一個與基礎類別名稱相同,但參數個數或參數型態可能相同也可能不同的函數。 12.1 多載與超載 (續) 呼叫同一個類別的多載函數時,可以因不同的參數個數或不同的參數型態,而自動執行對應的多載函數。 可是呼叫基礎類別或衍生類別的多載函數時,卻不會自動執行對應的多載函數,而必須使用範圍運算符號加以限制呼叫的範圍。因此,這種多載函數(overloading function)實際只是超載函數(overriding function)的功能。 12.1.1 多載函數 建立Base類別 class Base //宣告基礎類別 { public: void show(char str1[], char str2[]) { cout str1 \t str2 endl; } }; 12.1.1 多載函數 (續) 建立Derived類別以public型態繼承Base類別 class Derived: public Base //宣告衍生類別 { public: void show(char str3[]) { //衍生類別多載方法 cout str3 endl; } }; 12.1.1 多載函數 (續) 建立Derived物件d並呼叫Derived類別的show函數 int main() { Derived d; //建立Derived物件d char s1[] = 基礎參數1; //定義並起始s1字串 char s2[] = “基礎參數2”; //定義並起始s2字串 char s3[] = 衍生參數; //定義並起始s3字串 d.show(s1, s2); //呼叫Derived多載方法錯誤 d.Base::show(s1, s2); //呼叫Base方法 d.show(s3); //呼叫Derived多載方法 return 0; //正常結束程式 } 12.1.2 超載函數 建立Base類別 class Base //宣告基礎類別 { public: void show() { //基礎類別方法 cout 基礎類別show函數 endl; } }; 12.1.2 超載函數 (續) 建立Derived類別 class Derived: public Base //宣告衍生類別 { public: void show() { //衍生類別多載方法 Base::show(); //呼叫基礎類別show函數 cout 衍生類別show函數 endl; } }; 12.1.2 超載函數 (續) 建立Derived物件d,並呼叫Derived類別的show函數 int main() { Derived d; //建立Derived物件d d.show(); //呼叫Derived多載方法 return 0; //正常結束程式 } 12.2 虛擬函數 一般而言,C++ 在編譯過程會自動將同一類別的函數結合在一起(稱為靜態結合),因此當衍生類別含有基礎類別的超載函數,則執行時將自動呼叫同一類別的同名異式函數。 例如若此呼叫發生在基礎類別,則被呼叫的是基礎類別的同名異式函數;若此呼叫發生在衍生類別,則被呼叫的是衍生類別的同名異式函數。 12.2 虛擬函數 (續) 若以virtual宣告同名異式的函數,則C++ 在編譯過程會建立一個虛擬函數表(virtual function table),供執行時將同一物件的函數結合在一起(稱為動態結合),因此當執行時呼叫繼承體系中的同名異式,將呼叫物件所屬類別的同名異式函數。 例如若執行呼叫的是以基礎類別建立的物件,則被呼叫的是基礎類別的同名異式函數,若執行呼叫的是以衍生類別建立的物件,則被呼叫的是衍生類別的同名異式函數。 12.2.1 同名異式 同名異
文档评论(0)