C++ 名字重載、隱藏、覆蓋
阿新 • • 發佈:2019-05-02
引用 span bsp 頂層函數 構造 層次 結構 color virtual
名字重載Name overloading
如果頂層函數有不同的簽名,則函數名可以相同。 如果同一類中的函數有不同的簽名,則函數名可以相同。class C { public: C( ) { … } // default constructor C( int x ) { … } // convert constructor }; void print( double d ); void print( char * ); int main( ) { C c1,c2(26);//編譯過程中綁定函數調用和對應的函數體 print( 100.123); print( “100.123” ); }
名字覆蓋、重置 Name overriding
若基類方法 B::m 和派生類方法 D::m 具有相同的函數簽名,且基類方法 B::m 是 virtual 方法,則 D::m 重置了 B::m。 當通過基類指針或引用訪問被重置的方法 m 時,需要運行時動態綁定。class B { public: virtual void m( ) { … } };class D : public B { public: void m ()//重置了基類方法,仍然為虛函數 { … } }; int main( ) { B*p= new D; p -> m(); // 動態綁定 D::m() return 0; }
class B { public: void m( )//非虛函數,采用靜態綁定 { … } }; class D : public B { public: void m ( ) { … } }; int main( ) { B* p=new D; p ->m( ); //靜態綁定 B::m() return 0; }
名字覆蓋、重置 Name overriding 條件 在父、子類的函數,即存在繼承體系結構。 父類中標為virtual的成員函數。 通過父類的指針或是引用 指向或引用 一個對象,並調用虛函數。
名字隱藏 Name hiding
若基類 B 定義了非虛方法 m,同時其派生類 D 也定義了方法m,此時,我們說派生類方法 D::m 隱藏了繼承自基類的同名方法 B::m 。class B { public: void m(int x) { … } }; class D : public B { public: void m ( )//由於函數簽名不同,所以二者不構成重置。 { … } }; int main( ) { D d1 ; d1.m(); // invokes D::m() d1.m(10); // ERROR d1.B::m(10); // OK return 0; }由於函數簽名不同,所以二者不構成重置。故D::m隱藏了B::m。 n函數同名的一般理由如下: 1.以Top-level函數形式定義時,形成重載,表示他們完成相同的概念操作; 2.同一個類中的非構造函數,若同名則形成重載,表示他們完成相同的概念操作; 3.一個類存在多個構造函數:default constructor, copy constructor, convert constructer, … 4.在一個類繼承層次中,為支持方法多態,由基類定義虛函數,在派生類中重新定義-重置。
C++ 名字重載、隱藏、覆蓋