私はC++でのオーバーライドが何であるかを知っています。しかし、上書きはありますか?もしそうなら、それはどういう意味ですか?
ありがとう。
C ++の用語では、オーバーライド(クラス階層内の仮想メソッドに関連する)とオーバーロード(同じ名前を持つが異なるパラメーターを使用する関数に関連する)があります。また、名前を非表示にすることもできます(ネストされた宣言型領域またはスコープで同じ名前を明示的に宣言することにより)。
C ++標準では、正規の英語形式(つまり、x = 10
の前の値を上書きする割り当てのように、1つの値を新しい値に置き換える)を除いて、「上書き」という用語を使用しませんx
。
変数、たとえばint a = 0; a = 42;
ファイルを上書きできます(書き込み用に既存のファイルを開きます。権限がある場合は、既存のファイルの内容が上書きされます)。これは、オーバーライドとはほとんど関係がありません。おそらく過負荷を考えていましたか?
私がよく知っている通常の違いは、オーバーライドとオーバーロードです。仮想関数はオーバーライドされます。同じ名前で署名が異なるバージョンがある場合、関数はオーバーロードされます(これは多くの言語に存在します)。C ++では、演算子をオーバーロードすることもできます。
AFAIK、上書きは無関係の概念(変数、ファイル、バッファーなどを上書きする)であり、C++やOOP言語に固有のものではありません。
オーバーライドは、OOPの「通常のこと」です。派生クラスは、基本クラスをオーバーライドする、別の(つまりより特殊な)実装を提供します。たとえば、appleがフルーツから派生したクラスの場合はapple::foo()
オーバーライドします。(完全に異なる関数につながる、異なるパラメーター署名を使用することによる過負荷fruit::foo()
と間違えないでください)。
上書き私は完全に別の定義に置き換えることを知っています。特定のレベルではありませんが、一般的にプログラムの残りの部分についてです。大きなフレームワークに特別な問題があり、大きなファイルを分解したくない場合、これは時々javascriptを使用します。
<script type="text/javascript"
src="some super big framework, often in one big file">
<script type="text/javascript">
Ext.ux.window.createWin = function() {
// completely OVERWRITE the implementation
(often to 'hotfix' a particular bug)
}
</script>
ただし、C ++でそのようなことはわかりません。関数の再定義を同時に行うと、コンパイル時にすでにエラーが発生するためです。せいぜい、曲げ関数ポインタを画像化するか、コールバックフックを(再)定義することができます。
C++関数のオーバーライド。派生クラスがその基本クラスで定義されているのと同じ関数を定義している場合、それはC++での関数オーバーライドとして知られています。これは、実行時のポリモーフィズムを実現するために使用されます。これにより、基本クラスによってすでに提供されている関数の特定の実装を提供できます。
オーバーライドとは、基本クラスで仮想キーワードを使用してメソッドを作成することを意味し、基本クラスは、子クラスが同じメソッドの本体を自分自身で作成できるようにします。
上書きとは、仮想キーワードなしで上書きすることを意味します。
オーバーロードとは、1つの名前で異なる入力パラメーターを使用して複数のメソッドを作成することを意味します。
サンプル:
#include <stdio.h>
#include <stdlib.h>
class par_overwrite
{public: par_overwrite() {}; ~par_overwrite() {};
int at() { return 1; };
};
class chld_overwrite :public par_overwrite
{public: chld_overwrite() {}; ~chld_overwrite() {};
int at() { return 2; }//overwrite
};
void main_overwrite()
{
par_overwrite pt;
int ptat = pt.at();
chld_overwrite ct;
int ctat = ct.at();
printf("ptat:%d,ctat:%d\n",ptat, ctat); //output : ptat:1,ctat:2
}
class par_override
{public: par_override() {}; ~par_override() {};
virtual int ad() { return 3; };
};
class chld_override :public par_override
{public: chld_override() {}; ~chld_override() {};
int ad() { return 4; }//override
};
void main_override()
{
par_override pd;
int pdad = pd.ad();
chld_override cd;
int cdad = cd.ad();
printf("pdad:%d,cdad:%d\n", pdad, cdad); //output : pdad:3,cdad:4
}
class par_override_pure
{public: par_override_pure() {}; ~par_override_pure() {};
virtual int adp()=0;//Pure Virtual Function
};
class chld_override_pure :public par_override_pure
{public: chld_override_pure() {}; ~chld_override_pure() {};
int adp() { return 5; }//override from Pure Virtual Function
};
void main_override_pure()
{
//par_override_pure pdp;//error : Can not create object from abstract class that have (Pure Virtual Function)
//int pdpad = pdp.ad();//error
chld_override_pure cdp;
int cdpadp = cdp.adp();
printf("cdpadp:%d\n", cdpadp); //output : cdpadp:5
}
class overload
{public: overload() {}; ~overload() {};
void method_overload(int prm1) { printf("ol1\t"); }
void method_overload(int prm1, int prm2) { printf("ol2\t"); }
void method_overload(int prm1, int prm2, int prm3) { printf("ol3\t"); }
void method_overload(double prm1) { printf("ol4\t"); }
void method_overload(double prm1, double prm2) { printf("ol5\t"); }
void method_overload(double prm1, double prm2, double prm3) { printf("ol6\t"); }
};
void main_overload()
{
overload ol;
ol.method_overload(1);
ol.method_overload(1, 1);
ol.method_overload(1, 1, 1);
ol.method_overload(0.1);
ol.method_overload(0.1, 0.1);
ol.method_overload(0.1, 0.1, 0.1); // output : ol1 ol2 ol3 ol4 ol5 ol6
}
int main()
{ main_overwrite();
main_override();
main_override_pure();
main_overload();
getchar();
return 0;
}
/* output:
ptat:1,ctat:2
pdad:3,cdad:4
cdpadp:5
ol1 ol2 ol3 ol4 ol5 ol6
*/