C ++とJavaの世間話
C ++ ------------- Javaの
--------通常の関数仮想関数
純粋仮想関数--------抽象
抽象クラス--------抽象クラス
仮想基本クラスインターフェイス--------
仮想関数が定義される仮想基本クラスのメンバー関数と派生クラスが再定義されたのうちの1つまたは複数の宣言、使用形式:仮想関数の戻り型関数名(パラメータリスト){}関数本体と、多状態を派生クラスのベースクラスのポインタ又は参照、同じ名前の派生クラスのアクセスカバー部材関数による抵抗、。----(Baiduの百科事典)
#include<iostream>
using namespace std;
class A
{
public:
void virtual FUN()
{
cout<<"FUN in A is called"<<endl;
}
};
class B : public A
{
public:
void FUN()
{
cout<<"FUN in B is called"<<endl;
}
};
int main()
{
A a;
B b;
A *p;
p = &a;
p->FUN();
p = &b;
p->FUN();
return 0;
}
業績
FUN in A is called
FUN in B is called
仮想を削除した後、運用結果になった場合
FUN in A is called
FUN in A is called
その基本クラスは、多型を達成するために、別のオブジェクトへのポインタを定義します。
関数が仮想関数でない場合にC ++では、機能はしないオブジェクト・ポインタ・ポイントのタイプに応じて、決定されたタイプに基づいて現在のポインタと呼ばれます。
Javaでは、関数は抽象関数ではない場合は、しかし、同様の機能は、C ++の仮想関数のデフォルトの実装である通常の関数、つまり、と言う関数を呼び出すことであるが、判断するために、現在のオブジェクトのポインタポイントの種類に基づいており、代わりに、ポインタの種類に応じて決定されます。通常のC ++の関数の反対。すなわち:仮想関数で自動的にJAVA。
例えば:
package Virtual;
public class VirtualTest {
public static void main(String args[]) {
A a = new A();
B b = new B();
A p;
p = a;
p.FUN();
p = b;
p.FUN();
}
}
class A{
public void FUN(){
System.out.println("FUN in A is called");
}
}
class B extends A{
public void FUN(){
System.out.println("FUN in B is called");
}
}
実行結果
FUN in A is called
FUN in B is called
純粋仮想関数と抽象クラス
定義:純粋仮想関数が基底クラスの仮想関数内で宣言されているが、それが基底クラスで定義されているが、任意の派生クラスは、独自の実装を定義しなければならないことを要求されていません。基底クラスの純粋仮想関数を実現する方法は、関数プロトタイプ「= 0」の後に追加されます
virtual void funtion1()=0
その派生クラスで、純粋仮想関数を定義する目的は、単にインターフェイス機能を継承します。
すべてのクラスオブジェクト(主に派生クラスのオブジェクト)は、純粋仮想関数のアクションを実行することができますが、クラスは純粋仮想関数のための合理的なデフォルトの実装を提供することができないように、純粋仮想関数を意味。だから、純粋仮想関数の宣言クラスは、デザイナーのサブクラスが、言われている「あなたは純粋仮想関数の実装を提供する必要がありますが、私はあなたがそれを達成する方法がわかりません。」
純粋仮想関数のクラスを含むことは抽象クラスです。
抽象メソッドと抽象クラス
クラスは、特定のターゲットを記述するのに十分な情報が含まれていない場合は、そのようなクラスは抽象クラスです。
抽象クラスは、オブジェクトをインスタンス化することはできませんので、抽象クラスを継承する必要があり、使用することができます。
親クラスは、一般的なサブクラスのセットが含まれていますが、これらのメソッドを使用することはできませんので、理由は、親クラス自体の、抽象的です。
Javaの抽象クラスに継承され表し、クラスが抽象クラスを継承することができるが、このクラスは、複数のインターフェイスを実装することができます。
Java言語は、抽象クラス、抽象クラスを定義するために使用されます。
public abstract class leiming{
---------
}
抽象メソッドを宣言するための構文は次のとおりです。
abstract <方法返回值类型><方法名>(参数列表);
これは、抽象メソッドが抽象クラスである必要があります含まれていますが、抽象クラスは必ずしも抽象メソッドが含まれていません
仮想基底クラス
キーワードで仮想基底クラスの仮想継承親クラスの宣言、ベースクラスはサブクラスが複数のリンクを継承しているが、このサブクラスは、仮想基底クラスのバックアップのみが含まれている場合でも、基本クラスの仮想主仮想基底クラスの役割が配置されている後継者問題であいまいさを解決します。
関係なく、仮想基本クラスはこれの直接的な影響ではないかどうかの原因親仮想基底クラスで、それは各サブクラスのコンストラクタで表示されている必要があり、仮想基底クラスのコンストラクタを呼び出します。
第二に、他の非仮想ベースクラスが呼び出されるより前の仮想基底クラスのコンストラクタのコンストラクタを呼び出します。
これは、上記の二つの仮想基底クラスの特徴です。
インターフェース
Java(登録商標)、次のインタフェースの指定された形式で:
[public] interface InterfaceName {
}
インタフェースは、変数やメソッドが含まれていてもよいです。
、注意してくださいしかし、インタフェース変数は暗黙的のpublic static final変数として指定されている(そして唯一の公共静的変数決勝、コンパイルエラーは、プライベートの変更で報告される)、および方法は、暗黙的にパブリック抽象メソッドとして指定されますそして唯一の公共の抽象メソッドに(例えば、民間の保護、静的、最終的およびその他の変更などの追加のキーワードでコンパイルエラーを報告します)、およびインタフェースのメソッドは、すべての特定の実装を持っていない、つまり、この方法は、インタフェースなければなりません彼らは抽象的です。私たちは漠然と抽象クラスとインタフェースの違いを見ることができるここから、インターフェイスタイプは、それが抽象クラスよりも「抽象的」である、非常に抽象的であり、変数は通常の状況下で、インターフェイスで定義されていません。
インタフェースは、キーワードを拡張することによって実現することができ、複数のインターフェイスを継承することができ、構文は、クラス継承と同一である複数の親クラス・インターフェースがある場合、継承クラスインターフェースは、カンマで区切って、親クラス・インターフェースと呼ばれます。
実装クラスがインタフェース句を実装して表します。クラスは、同時に複数のインタフェースを実装することができます。体内のインタフェースメソッドを実装するクラスコードに追加されなければなりません。
詳細を見つけることができる
Javaインターフェースと抽象クラスの深い理解を