C++虚関数とJAVA抽象関数の比較
13178 ワード
C++の基礎文法はJavaより複雑で柔軟である.C++—————Java虚関数------普通関数純虚関数------抽象関数抽象類------抽象類純虚類------インタフェース
C++:
C++は静的アセンブリと動的アセンブリを組み合わせた方法を採用した.コンパイル時のマルチステート(静的アセンブリ)は主に関数リロードと演算子リロードによって実現され、実行時のマルチステート(動的アセンブリ)は主に虚関数によって実現される.
C++の一般的な関数は書き換えてはいけません.関数が虚関数でない場合は、現在のポインタタイプからポインタが指すオブジェクトではないと判断する関数を呼び出します.派生クラスがベースクラスの虚関数を書き換えた場合、現在のポインタが指すオブジェクトのタイプに基づいて関数が呼び出されます.
抽象クラスは、少なくとも1つの純粋な虚関数を持つクラスです.すなわち,クラスに虚関数が実装されていない場合,抽象クラスである.抽象クラスはオブジェクトを直接宣言することはできません.派生クラスがベースクラスを継承し、純粋な虚関数が実装されていない場合、派生クラスは抽象クラスです.純粋な虚関数を宣言する一般的な形式は、
C++はマルチ継承機能を提供し、また異なる継承方式がある.実際には、C++のマルチ継承機能が面倒になるため、1つの派生クラスが2つのベースクラスを継承し、この2つのベースクラスが同じベースクラスから来た場合、元のベースクラスデータと関数の二義性をもたらすため、虚ベースクラスがあり、これらの同名メンバーにアクセスする際には、派生クラスオブジェクト名の後に直接ベースクラス名を追加する必要があります.二義性が生じないように、メンバーを一意に識別します.
BirdがCrowクラスとSparrowクラスを派生する場合、キーワードvirtualを使用してクラスBirdをダミーベースクラスとして宣言し、birdDrinkがそれらを継承するときに変数waterを共有します.(例はあまりよく挙げられていません23333)
JAVA:
Javaでは、関数が抽象関数ではなく一般関数である場合、C++の虚関数のような機能をデフォルトで実装します.つまり、ある関数を呼び出すのは、現在のオブジェクトのタイプに基づいて判断されます.関数が抽象関数である場合,C++の純虚関数に相当し,具体的な方法は実現されない.
Javaの抽象クラスはabstractキーワードで宣言する必要があり,Javaの抽象クラスでは抽象メソッドがあっても抽象メソッドがなくてもよい.抽象クラスは、オブジェクトを直接宣言することはできません.
Javaは単一の継承のみを提供し、マルチ継承機能をシミュレートするためにインタフェースを提供し、1つのクラスは複数のインタフェース(interface)を実現することができる.Javaのインタフェースでは、関数タイプはデフォルトで「public abstract」タイプ、変数タイプはデフォルトで「public static final」タイプです.JAvaのインタフェースはC++の純虚クラスに似ています.つまり、クラス内の関数は純虚関数であり、変数もstatic finalに設定すればもっと似ています.
C++では次のようになります.
C++:
C++は静的アセンブリと動的アセンブリを組み合わせた方法を採用した.コンパイル時のマルチステート(静的アセンブリ)は主に関数リロードと演算子リロードによって実現され、実行時のマルチステート(動的アセンブリ)は主に虚関数によって実現される.
C++の一般的な関数は書き換えてはいけません.関数が虚関数でない場合は、現在のポインタタイプからポインタが指すオブジェクトではないと判断する関数を呼び出します.派生クラスがベースクラスの虚関数を書き換えた場合、現在のポインタが指すオブジェクトのタイプに基づいて関数が呼び出されます.
抽象クラスは、少なくとも1つの純粋な虚関数を持つクラスです.すなわち,クラスに虚関数が実装されていない場合,抽象クラスである.抽象クラスはオブジェクトを直接宣言することはできません.派生クラスがベースクラスを継承し、純粋な虚関数が実装されていない場合、派生クラスは抽象クラスです.純粋な虚関数を宣言する一般的な形式は、
virtual ( )=0;
です.class Person
{
public:
virtual void eat(){}
virtual void walk()
{
cout<<" "<<endl;
}
virtual void look()=0;
};
C++はマルチ継承機能を提供し、また異なる継承方式がある.実際には、C++のマルチ継承機能が面倒になるため、1つの派生クラスが2つのベースクラスを継承し、この2つのベースクラスが同じベースクラスから来た場合、元のベースクラスデータと関数の二義性をもたらすため、虚ベースクラスがあり、これらの同名メンバーにアクセスする際には、派生クラスオブジェクト名の後に直接ベースクラス名を追加する必要があります.二義性が生じないように、メンバーを一意に識別します.
#include
using namespace std;
class Bird
{
public:
Bird()
{
water=100;
}
void show()
{
cout<<" "<<water<<"ml "<<endl;
}
virtual void drink(){}
protected:
int water;
};
class Crow:virtual public Bird
{
public:
Crow()
{
water=water-5;
}
};
class Sparrow:virtual public Bird
{
public:
Sparrow()
{
water=water-10;
}
};
class birdDrink:public Crow,public Sparrow
{
public:
void drink()
{
water=water-20;
}
};
int main()
{
Bird *p;
birdDrink bd;
p=&bd;
p->drink();
p->show();
return 0;
}
BirdがCrowクラスとSparrowクラスを派生する場合、キーワードvirtualを使用してクラスBirdをダミーベースクラスとして宣言し、birdDrinkがそれらを継承するときに変数waterを共有します.(例はあまりよく挙げられていません23333)
JAVA:
Javaでは、関数が抽象関数ではなく一般関数である場合、C++の虚関数のような機能をデフォルトで実装します.つまり、ある関数を呼び出すのは、現在のオブジェクトのタイプに基づいて判断されます.関数が抽象関数である場合,C++の純虚関数に相当し,具体的な方法は実現されない.
Javaの抽象クラスはabstractキーワードで宣言する必要があり,Javaの抽象クラスでは抽象メソッドがあっても抽象メソッドがなくてもよい.抽象クラスは、オブジェクトを直接宣言することはできません.
abstract class Person{
public void eat(){}
public void walk(){
System.out.println(" ");
}
abstract void look();
}
Javaは単一の継承のみを提供し、マルチ継承機能をシミュレートするためにインタフェースを提供し、1つのクラスは複数のインタフェース(interface)を実現することができる.Javaのインタフェースでは、関数タイプはデフォルトで「public abstract」タイプ、変数タイプはデフォルトで「public static final」タイプです.JAvaのインタフェースはC++の純虚クラスに似ています.つまり、クラス内の関数は純虚関数であり、変数もstatic finalに設定すればもっと似ています.
interface studyLanguage{
// public static final
int wordNumber=3500;
int grammarNumber=150;
// public abstract
void listen();
void speak();
void read();
void write();
}
C++では次のようになります.
class studyLanguage
{
public:
static const int wordNumber=3500;
static const int grammarNumber=150;
virtual void listen()=0;
virtual void speak()=0;
virtual void read()=0;
virtual void write()=0;
};