C ++オブジェクト指向プログラミングの研究ノート(6)

ポリモーフィズム

実行コンパイル時の多型と多型

オブジェクト指向のプロセスにおいて、異なるオブジェクト、異なる動作で同一の情報を受信する多型と呼ばれます。C ++プログラミング、すなわち「一のインタフェース、複数の方法」
C ++で、多型の実装と概念を構築し、コンパイルされたソースコード、実行可能ファイルとして知られている接続は、プロセスであります実行可能なコードを一緒ビルドプロセス。実行する前に、これもポストビルドとして知られる、動的バインディングと呼ばれて完了し、静的結合と呼ばれるも、事前にビルドとして知られ、実行時に終了した
時点多型は、多型の静的バインディングコンパイラのサポートと呼ばれていますまた、静的な多型として知られ、機能の過負荷およびC言語で実装テンプレートで++、ダイナミックな結合担体は、実行時の多型はまた、動的多型として知られる、多型と呼ばれ、C ++仮想関数によって実装します

演算子のオーバーロード

オペレータは、オペレータは、メンバ関数またはフレンド関数であってもよい外部を定義した関数の一般的なクラスであってもよい演算子オーバーロード機能を実現する機能をオーバーロードすることにより作成したオーバーロード。

演算子のオーバーロード機能のクラスの外で定義されました

C ++演算子のオーバーロードは、即ちオペレータのオーバーロード時、方法が提供され、オペレータがオーバーライドするオペレータ、続い、オペレータの名前を多重定義関数を定義する必要があります。

//例:重载'+'号
类名 operator+(类名1 对象名1,类名2 对象名2)
{
    ......
}
//即可使用以下两种方式调用'+'号重载
对象名1+对象名2;
operator+(对象名1,对象名2);

注:
1.C ++あなたは、オペレータの大半を上書きすることができますが、事業者の例外
 。会員オリエンテーション演算子
 。*ポインタメンバアクセス演算子
 ::スコープ演算子
 はsizeof長演算子
 ?:条件演算子
2.C ++ためのみ既存のC ++過負荷演算子
の本来の機能に類似していなければならない機能をオーバーロード一般的に3、
操作対象4.過負荷演算子の数を変更することはできません
変化しない5.過負荷元の演算子の優先順位
6過負荷オペレータは、元の結合特性を変更することはできません
7.パラメータ演算子のオーバーロードは、少なくとも1つ(またはクラスオブジェクト参照)の関数であるクラスオブジェクト
一般に8.のクラスオブジェクトオペレータは、オーバーロードする必要がありますが、代入演算子「=」の例外は、ユーザーが過負荷にする必要はありません。

友達演算子のオーバーロード

C ++では、あなたは、このクラスの機能は、友人であるように、オペレータの関数が定義されている友人と呼ばれる演算子のオーバーロードをリロードすることができます

文法形式

演算子のオーバーロードの関数としてのクラス、フォーム定義の友人の中1

friend 函数类型 operator 运算符(形参表)
{
    函数体
}

2クラスの外側に、演算子のオーバーロードの関数として帳票定義友達

//在类中,声明友元函数重载函数原型
class X
{
    ......
    friend 函数类型 operator 运算符 (形参表);
    ......
}
//在类外部,定义友元运算符重载函数
函数类型 operator 运算符 (形参表)
{
    函数体
}

Xはクラス名であり、オペレータの機能のフレンド関数型指定された操作の戻り型、演算子キーワードが定義されているオペレータオーバーロード機能、すなわち、オペレータは、オペレータ名を上書きすることです

バイナリ演算子のオーバーロード
class 类名
{
    ......
    friend 函数类型 operator @ (形参表);
    ......
}
函数类型 operator@(类名1 对象名1,类名2 对象名2)
{
    ......
}
//即可使用以下两种方式调用重载
对象名1@对象名2;
operator@(对象名1,对象名2);
//@即为运算符
単項演算子のオーバーロード
class 类名
{
    ......
    friend 函数类型 operator @ (形参表);
    ......
}
函数类型 operator@(类名 对象名)
{
    ......
}
//即可使用以下两种方式调用重载
@对象名;
operator@(对象名);
//@即为运算符

説明:
1.オペレータ@演算子のオーバーロード関数はvoid型であっても、任意の型を返すことができ
、そのような代入演算子「=」、添字演算子「[]」として、2いくつかの演算子は演算子のオーバーロード友人の関数として定義することはできません関数呼び出し演算子「()」など

メンバー演算子のオーバーロード

C ++では、関数を再ロードすることができ、オペレータが呼び出さメンバ関数演算子のオーバーロード、クラスのメンバー関数として定義されています

文法形式

クラス内の1、演算子のオーバーロードの関数として帳票定義メンバー

函数类型 operator 运算符(形参表)
{
    函数体
}

2クラスの外側に、演算子のオーバーロードの関数として帳票定義友達

//在类中,声明成员运算符重载函数原型
class X
{
    ......
    函数类型 operator 运算符 (形参表);
    ......
}
//在类外部,定义成员运算符重载函数
函数类型 X:: operator 运算符 (形参表)
{
    函数体
}

Xはクラス名であり、オペレータの機能のフレンド関数型指定された操作の戻り型、演算子キーワードが定義されているオペレータオーバーロード機能、すなわち、オペレータは、オペレータ名を上書きすることです

バイナリ演算子のオーバーロード
class 类名
{
    ......
    函数类型 operator @ (形参表);
    ......
}
函数类型 类名::operator@(类名 对象名)
{
    ......
}
//即可使用以下两种方式调用重载
对象名1@对象名2;
对象名1.operator@(对象名2);
//@即为运算符
単項演算子のオーバーロード
class 类名
{
    ......
    函数类型 operator @ ();
    ......
}
函数类型 类名::operator@()
{
    ......
}
//即可使用以下两种方式调用重载
@对象名;
对象名.operator@();
//@即为运算符
ご注意ください

1.バイナリ演算子のカテゴリを使用して、クラスオブジェクトと他のオブジェクトの操作は、必要に応じて、任意のオブジェクトの2種類を置くことがとき、あなたはオペレータの友人を使用する必要があります

「+」と「 - 」のリロード

インクリメント演算子「++」とデクリメント演算子「 - 」は、異なる役割可変表裏に配置
オーバーロードすることができるように、接頭辞+ OB方法のためにob.operator++();、またはoperator++(X &ob);
OB +サフィックスモードのために、無効にすることができであるob.operator++(int);か、operator++(X &ob,int);
呼び出しがパラメータ値に渡された場合、一般的に0 int型
「 - 」に類似演算子を

注:
友人オペレータのオーバーロード機能は、このポインタを行うので、オブジェクト・ポインタポイントとしてこれを参照することができません。オーバーロードされたフレンド関数は、データオブジェクトの参照パラメータを渡すために使用されるべきである場合

代入演算子「=」リロード

Xのクラスのいずれか、そこにカスタム代入演算子のオーバーロードであれば、そして自動的にデフォルトの代入演算子関数を生成

しかし、そのようなポインタの存在下でのクラスとして、いくつかの特別な場合に、過負荷の問題が発生し、デフォルトの代入演算子は、表示代入演算子のオーバーロードを定義する必要があります

注:
それは混乱の代入文につながるように、クラスの代入演算子は「=」のみ、メンバ関数、オーバーロード関数としてではなく友人として、オーバーロードすることができます

添字演算子「[]」リロード

オペレータのオーバーロードは、メンバ関数は、次の形式のように定義することができます。

返回类型 类名 :: operator [] (形参)
{
    //函数体
}

注:
唯一つのパラメータによってパラメータ

型変換

システム定義の型変換の間

型変換は、別の型の値に一つのタイプの値を変換することです。C ++は、変換の二つのタイプを提供する:一方は、暗黙的型変換であり、他は、明示的な型変換です。

暗黙の型変換

暗黙の型変換は、次の規則に従う:
割り当て1.代入式A = Bの場合には、オペレータの右端の値BはA型に変換する必要があり
2.char又は短いint型変数および操作変数のタイプ場合、変換charまたは短いint型可変型
矛盾3.操作対象、低レベル操作タイプが自動的にハイレベルの型に変換される前に

明示的な型変換

1.(int型)は、i // C言語形式の
2.int(I)// C ++の形で
、C ++、CのC ++の予約使用量が、フォームの利用を促進

システム定義のクラス型と型変換の間

変換コンストラクタによる型変換
効果の変換関数は、クラスのオブジェクトである他の種類のデータのいずれかを変換するように構成されています

インプリメンテーション:
クラスコンストラクタは単一のパラメータで定義され、パラメータは、変換されるデータのタイプ、の関数本体で指定された変換方法である
。例:

Complex(double r)
{
    real=r;imag=0;
}

型変換は、次の形式で行ってもよいです

类名(待转换类型的数据)

注:
1.変換コンストラクタの本質もコンストラクタで、コンストラクタは、一般的なルールに従うが、唯一つのパラメータ
2変換コンストラクタは、クラスのコンストラクタオブジェクトの別のクラスのオブジェクトを変換することができ

型変換型変換関数を
クラスの型変換関数を作用は、オブジェクトが別のデータ型を変換する
一般的なフォーマットであります

operator 目标类型()
{
    函数体
}

ターゲット・タイプは、所望のタイプ名に変換される、事前定義標準データ型であってもよいことは、クラスの他のタイプとすることができる
関数の戻り値のタイプターゲット・タイプであります

注:
1.型変換関数はメンバー関数として定義することができる
前に、型変換関数はいずれも、パラメータ2は、関数の種類を指定することはできません
。3.必須のreturnステートメント
4 Aクラスは、変換関数の複数種類のように定義することができます

仮想関数

仮想関数が別のフォームを上書きされ、過負荷が動的な方法です。
仮想関数は、関数呼び出しと動的に結合することを、操作を実行する方法を決定する際、ある実行時に確立関数本体との間の接続を可能にします。

導入

ベース・クラス・オブジェクトへのポインタがその公開派生オブジェクトを指すことができ、それは公共の派生クラスのオブジェクトを指す場合、それだけで、基本クラスのメンバーから派生したクラスの継承にアクセスすることができ、かつないアクセスパブリッククラス定義を派生することができる:C ++の提供しますメンバー。
基準仮想関数は、動的な関数呼び出しを達成するためにする場合

定義

仮想ファンクションキーは、基底クラスの仮想関数に記載されており、派生クラスで再定義することです。
効果は、同じ名前のベースクラスの派生クラスで再定義の機能を可能にすることで、ベースクラスの同じ名前のベースポインタまたは参照によってアクセスすることができ、派生クラス
、基本クラスを定義した仮想関数が基底クラスで行われます次のようにメンバ関数を定義する必要は、ブランドのキーワード仮想上の仮想関数を宣言されます。

virtual 函数类型 函数名 (形参表)
{
    函数体
}

基底クラスのメンバ関数の後仮想関数は、仮想関数が派生クラスで再定義以上、関数プロトタイプを含め、再定義する場合、プロトタイプの関数名はので、基本クラスを完了する必要がありますすることができ宣言されています同じ。

注:
1.クラスは外を定義したとき、基底クラスの仮想関数は、唯一のプロトタイプを宣言した場合は、仮想追加しないでください
。2.を派生クラスの仮想関数で再定義、キーワード仮想書き込みが書かれてもよいが、それは書くことが最善である
3を派生クラスの基底クラスの仮想関数の公共の再定義については、そのベースがクラスの仮想関数を導出以下、継承される回数に関係なく、まだその特徴的な仮想関数を保持していない場合
4.仮想関数はどこクラスのメンバ関数でなければならず、ない友人関数または静的メンバ関数
実行時ポリモーフィズムを取得するための5は、基底クラスの仮想関数ポインタを通じてのみアクセス可能です

仮想デストラクタ

C ++コンストラクタは、仮想関数を宣言することはできないが、仮想デストラクタを宣言することができる
一般的なフォーマットに従っvirtual ~类名();

仮想関数オーバーロードされた関数との関係

基底クラス、仮想関数がオーバーロード機能の派生クラスで再定義が、通常の関数とは異なるがオーバーロード別の形態
の通常の機能をオーバーロードするとき、異なるタイプでなければならない関数のパラメータ又はパラメータ、戻り型異なる場合があります
が、オーバーロードされた仮想関数では、要件が同じでなければなりません

多重継承と仮想関数

多重継承は、複数の単一継承、多重継承と単一継承の組み合わせとして見ることができ、したがって、類似性があります

抽象クラスと純粋仮想関数

時には、基底クラスは、それが特定の物事にリンクされていない、抽象的な概念を表します。
純粋仮想関数が基底クラスの仮想関数に説明され、それは基底クラスで定義され、それは、そのニーズに応じて定義される派生クラスを必要とされていない、またはまだ純粋仮想関数として説明
一般的な形式

virtual 函数类型 函数名(参数表) =0;

仮想関数の一般的な形式は似ていますが、「= 0」が戻って追加し
、純粋仮想関数として宣言され、機能が一部達成するための基本クラスを与えられていない
、派生クラス名の保持機能という効果純粋仮想関数を再定義する派生クラス
純粋仮想メンバ関数が何を持っている、「= 0」と呼ぶことができない唯一の純粋仮想関数を示していません

Ruoguoはクラスと呼ばれる少なくとも一つの純粋仮想関数のクラスは、抽象的である
所定の抽象クラス:
別の抽象クラスとして1だけ基底クラスは抽象クラスオブジェクト確立できない
2は、パラメータ・タイプとして使用することができません、関数の戻り値の型や明示的な型変換。しかし、あなたは抽象クラス変数へのポインタを宣言することができ、その派生クラスへのポインタが
再び抽象派生クラスの宣言がない純粋仮想関数は、派生クラス内の関数は純粋仮想関数遺跡、派生クラス3である場合抽象クラス

おすすめ

転載: www.cnblogs.com/springfield-psk/p/12001241.html