C++名前のリロード、非表示、上書き
6804 ワード
名前のリロードName overloading
最上位レベルの関数に異なる署名がある場合は、関数名を同じにすることができます.
同じクラスの関数に異なる署名がある場合は、関数名を同じにすることができます.
C++では、同じ役割ドメイン内で同じ名前でいくつかの異なる実装の関数を定義できます.メンバー関数でも非メンバー関数でも構いません.ただし、このようなリロード関数を定義する際に要求される関数のパラメータは、少なくとも1つのタイプが異なるか、または個数が異なる.戻り値のタイプには要求がなく、同じでも異なってもよい.
名前の上書き、名前のリセット
ベースクラスメソッドB::mと派生クラスメソッドD::mが同じ関数署名を有し、ベースクラスメソッドB::mがvirtualメソッドである場合、D::mはB::mをリセットする.
リセットされたメソッドmにベースクラスポインタまたはリファレンスでアクセスする場合、実行時に動的にバインドする必要があります.
オーバーライド(override)は、生クラスに再定義が存在する関数を割り当てます.その関数名、パラメータ列、戻り値タイプは、親クラスの対応するオーバーライドすべき関数と厳密に一致する必要があります.オーバーライド関数とオーバーライドされた関数は、関数体のみが異なり、派生クラスオブジェクトが派生クラスの同名関数を呼び出すと、派生クラスのオーバーライドバージョンが自動的に呼び出されます.親クラスの上書きされた関数バージョンではなく、このメカニズムを上書きと呼びます.
名前の上書き、Name overriding条件のリセット
親、子クラスの関数、すなわち継承アーキテクチャが存在します.
親クラスはvirtualのメンバー関数として落札されます.関数の名前は同じで、パラメータは同じです.
親クラスのポインタまたは参照によってオブジェクトを指したり参照したりして、虚関数を呼び出します.
名前隠しName hiding
ベースクラスBが非虚メソッドmを定義し、その派生クラスDもメソッドmを定義する場合、派生クラスメソッドD::mはベースクラスから継承された同名メソッドB::mを非表示とする.
関数署名が異なるため、両者はリセットを構成しません.
よってD::m
隠してるB::m
.
n関数の同名の一般的な理由は以下の通りである.
1.Top-level関数として定義する場合、同じ概念操作を完了したことを示すリロードが形成される.
2.同じクラスの非構造関数で、同名であれば重荷を形成し、同じ概念操作を完了したことを示す.
3.1つのクラスに複数の構造関数が存在する:default constructor,copy constructor,convert constructer,...
4.クラス継承階層で、メソッドのマルチステートをサポートするために、ベースクラスによって虚関数を定義し、派生クラスで再定義-リセットします.
最上位レベルの関数に異なる署名がある場合は、関数名を同じにすることができます.
同じクラスの関数に異なる署名がある場合は、関数名を同じにすることができます.
C++では、同じ役割ドメイン内で同じ名前でいくつかの異なる実装の関数を定義できます.メンバー関数でも非メンバー関数でも構いません.ただし、このようなリロード関数を定義する際に要求される関数のパラメータは、少なくとも1つのタイプが異なるか、または個数が異なる.戻り値のタイプには要求がなく、同じでも異なってもよい.
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” );
}
名前の上書き、名前のリセット
ベースクラスメソッドB::mと派生クラスメソッドD::mが同じ関数署名を有し、ベースクラスメソッドB::mがvirtualメソッドである場合、D::mはB::mをリセットする.
リセットされたメソッドmにベースクラスポインタまたはリファレンスでアクセスする場合、実行時に動的にバインドする必要があります.
オーバーライド(override)は、生クラスに再定義が存在する関数を割り当てます.その関数名、パラメータ列、戻り値タイプは、親クラスの対応するオーバーライドすべき関数と厳密に一致する必要があります.オーバーライド関数とオーバーライドされた関数は、関数体のみが異なり、派生クラスオブジェクトが派生クラスの同名関数を呼び出すと、派生クラスのオーバーライドバージョンが自動的に呼び出されます.親クラスの上書きされた関数バージョンではなく、このメカニズムを上書きと呼びます.
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.1つのクラスに複数の構造関数が存在する:default constructor,copy constructor,convert constructer,...
4.クラス継承階層で、メソッドのマルチステートをサポートするために、ベースクラスによって虚関数を定義し、派生クラスで再定義-リセットします.