継承とポリモーフィズムを区別し、パブリック、プロテクト、プライベートを区別する
継承とポリモーフィズムの概念
面向对象三大原则:封装、继承、多态。
-
継承は、クラスが別のクラスからプロパティとメソッドを継承できるメカニズムです。派生クラス(サブクラス)は、基底クラス(親クラス)のメンバ関数やデータメンバを継承し、それを基にして独自のメンバ関数やデータメンバを拡張することができます。C++ は多重継承をサポートしています。つまり、派生クラスは複数の基本クラスから同時に継承できます。
-
ポリモーフィズムとは、同じ操作が異なるオブジェクトに作用し、異なる解釈が行われ、異なる実行結果が生成される可能性があることを意味します。C++ では、ポリモーフィズムを実現するには仮想関数の助けが必要です。仮想関数は、基本クラスで宣言された関数であり、派生クラスによって書き換えてさまざまな機能を実現できます。仮想関数が基本クラスへのポインターまたは参照を通じて呼び出される場合、プログラムは実際に指すオブジェクトの型に応じて対応する関数を呼び出します。この動作は動的バインディングと呼ばれます。つまり、呼び出される関数が決定されます。実行時。
継承とポリモーフィズムの違いと関係
継承とは、サブクラスが親クラスからプロパティとメソッドを継承するプロセスを指し、サブクラスは親クラスのメソッドをオーバーライド(オーバーライド)して、独自の機能を実現できます。継承によりコードが簡素化され、繰り返されるコードの量が減り、継承によるコードの再利用が実現します。
ポリモーフィズムとは、同じメソッドが異なるオブジェクトに対して異なる動作を生成することを意味します。ポリモーフィズムの実装では、通常、親クラス ポインターを使用してサブクラス オブジェクトを指すため、親クラス ポインターを通じてサブクラス メソッドを呼び出して、さまざまな動作を実現できます。ポリモーフィズムによりコードの柔軟性とスケーラビリティが向上し、プログラムの保守と拡張が容易になります。
違い:
-
継承はコードの再利用の方法であり、親クラスからプロパティとメソッドを継承できます。ポリモーフィズムはコードの実行の方法であり、同じメソッドが異なるオブジェクトで異なる動作をします。
-
継承は静的な関係であり、クラスはその継承関係をコンパイル時に決定します。ポリモーフィズムは動的な関係であり、特定の動作は実行時にのみ決定できます。
-
継承はトップダウンの設計手法であり、親クラスはサブクラスのテンプレートです。ポリモーフィズムはボトムアップの設計手法で、サブクラスが親クラスの動作を決定します。
接続:
-
継承とポリモーフィズムはオブジェクト指向プログラミングの重要な概念であり、コードの再利用を実現し、コードの柔軟性とスケーラビリティを向上させる重要な方法です。
-
ポリモーフィズムの効果を達成するには、親クラス ポインタがサブクラス オブジェクトを指すことができるため、ポリモーフィズムには前提条件として継承が必要です。
例
#include <iostream>
using namespace std;
// 基类
class Shape {
protected:
int width, height;
public:
Shape( int a = 0, int b = 0) {
width = a;
height = b;
}
virtual int area() {
cout << "Parent class area :" <<endl;
return 0;
}
};
// 派生类
class Rectangle: public Shape {
public:
Rectangle( int a = 0, int b = 0):Shape(a, b) {
}
int area () {
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
// 派生类
class Triangle: public Shape{
public:
Triangle( int a = 0, int b = 0):Shape(a, b) {
}
int area () {
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
int main( ) {
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// 存储矩形的地址
shape = &rec;
// 调用矩形的求面积函数 area
shape->area();
// 存储三角形的地址
shape = &tri;
// 调用三角形的求面积函数 area
shape->area();
return 0;
}
結果:
プログラム内では基底クラス Shape と 2 つの派生クラス Rectangle と Triangle が定義されており、これら 2 つの派生クラスは基底クラスの属性とメソッドを共有し、基底クラスの仮想関数 area() を書き換えていることがわかります。main() 関数では、基本クラスを指すポインター形状が最初に作成され、次にそれぞれ Rectangle オブジェクトと Triangle オブジェクトを指します。最後に、ポインタを介して仮想関数が呼び出されます。シェイプ ポインタは area メソッドを 2 回呼び出しますが、ポインタが異なるオブジェクトを指しているため、オブジェクトの種類に応じて異なる結果が出力されます。これがポリモーフィズムです。
継承およびアクセスされた権限
C++ では、クラスの継承はパブリック、プロテクト、プライベートの 3 つのタイプに分類されます。これらはそれぞれ、派生クラスの基本クラス メンバーのアクセス権を表します。
-
パブリック継承: 基本クラスのパブリック メンバーは派生クラスでも引き続きパブリックであり、基本クラスの保護されたメンバーは派生クラスでも引き続き保護され、基本クラスのプライベート メンバーは引き続きプライベートであり、プライベート メンバーは派生クラスで継承できません。アクセス。
-
保護された継承: 基本クラスのパブリック メンバーは派生クラスで保護されます。基本クラスの保護されたメンバーは派生クラスでも引き続き保護され、その派生クラスのメンバー関数とフレンド関数によってのみアクセスできます。基本クラスのプライベートメンバー派生クラスからはクラスにアクセスできません。
-
プライベート継承: 基本クラスのパブリック メンバーと保護されたメンバーは派生クラスではプライベートになり、派生クラスは基本クラスのプライベート メンバーにアクセスできません。
説明する
class Base {
public:
int a;
protected:
int b;
private:
int c;
};
class Derived1 : public Base {
// a是public的,b是protected的,c不能访问
};
class Derived2 : protected Base {
// a是protected的,b是protected的,c不能访问
};
class Derived3 : private Base {
// a是private的,b是private的,c不能访问
};
例:
#include <iostream>
using namespace std;
class Parent {
public:
void publicMethod() {
cout << "This is a public method of Parent class." << endl;
}
protected:
void protectedMethod() {
cout << "This is a protected method of Parent class." << endl;
}
private:
void privateMethod() {
cout << "This is a private method of Parent class." << endl;
}
};
class Child : public Parent {
public:
void callParentMethods() {
publicMethod(); // 公有方法可以在子类中直接访问
protectedMethod(); // 保护方法可以在子类中直接访问
// privateMethod(); // 私有方法不能在子类中直接访问
}
};
int main() {
Child childObj;
childObj.publicMethod(); // 公有方法可以在子类对象中直接访问
// childObj.protectedMethod(); // 保护方法不能在子类对象中直接访问
// childObj.privateMethod(); // 私有方法不能在子类对象中直接访问
childObj.callParentMethods(); // 子类中的方法可以调用父类的公有和保护方法
return 0;
}
このサンプル プログラムでは、Parent クラスにpublicMethod()、protectedMethod() 、およびprivateMethod()という 3 つのメンバー メソッドがあり、それらのアクセス権はそれぞれ public、protected、および private です。Child クラスは Parent クラスを継承し、その中にメソッド callParentMethods() を定義します。このメソッドは、Parent クラスの publicMethod() メソッドと protectedMethod() メソッドを呼び出すために使用されます。main 関数では、Child クラスのオブジェクト childObj を作成し、さまざまなアクセス方法と権限を示します。
結果
このサンプルプログラムからわかるように、パブリックメンバーはサブクラスおよびサブクラスオブジェクトを含むどこからでもアクセスできます; プロテクトメンバーはサブクラスおよびサブクラスオブジェクト内でのみアクセスできます; プライベートメンバーはクラス内でのみアクセスできます サブクラスを含む内部にアクセスしますアクセスできません。
**ヒント:** 継承方法をプライベート継承または保護された継承に変更する場合、main 関数で
childObj.publicMethod();
また、保護またはプライベート継承の後、パブリック メソッドのアクセス許可が変更され、サブクラス オブジェクトは基本クラスのパブリック メソッドはもちろん、プライベート メソッドや保護されたメソッドにもアクセスできないため、ステートメントはエラーも報告します。