1. 程式人生 > >C++ 名字重載、隱藏、覆蓋

C++ 名字重載、隱藏、覆蓋

引用 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++ 名字重載、隱藏、覆蓋