C++ 仮想関数の詳細な説明: ポリモーフィズムの原則とオブジェクト指向プログラミングにおけるその応用

ポリモーフィズムは、オブジェクト指向プログラミングにおいて非常に重要な概念です。ポリモーフィズムとは、同じオブジェクトが異なるコンテキストで使用されると、異なる動作をする可能性があることを意味します。C++ はオブジェクト指向プログラミング言語で、C++ では仮想関数がポリモーフィズムの鍵となります

仮想機能とは

仮想関数は、サブクラスによってオーバーライドされ、異なる実装を提供できる基本クラスで宣言された関数です。C++ では、キーワードを使用してvirtual仮想関数を宣言します。仮想関数の原則は、関数呼び出しの制御をコンパイル時環境ではなくランタイム環境に与えることです。したがって、仮想関数の実装は実行時に決定する必要があります。仮想関数の宣言形式は次のとおりです。

 virtual 返回类型 函数名(参数列表) {
   // 实现代码
 }
复制代码

例えば:

 class Shape {
   public:
     virtual void draw() {
       // 实现代码
     }
 };
 
 class Circle : public Shape {
   public:
     void draw() override {
       // 实现代码
     }
 };
复制代码

上記の例では、Shapeクラスは仮想関数を定義しdraw()Circleクラスでオーバーライドされます。このキーワードは、C++11 で導入された新機能であるCircleclass のオーバーライドされた関数で使用されていることに注意してください。これは、関数が基本クラスで同じ名前のオーバーライドされた関数であることを示しています。override

ポリモーフィズムの実装

基本クラスのポインターまたは参照を使用して派生クラス オブジェクトにアクセスする場合、仮想関数がオーバーライドされている場合は、派生クラスの実装が呼び出されます。実際に呼び出す関数は実行時に決定されるため、この動作はランタイム ポリモーフィズムと呼ばれます。例えば:

 Shape* s = new Circle();
 s->draw(); // 调用Circle类中的draw()函数
复制代码

上記の例では、基本クラス ポインターを使用してクラスのオブジェクトsにアクセスします。これは、クラスが関数をオーバーライドし、クラスの実装が呼び出されるためです。この動作により、コードの柔軟性と拡張性が向上し、保守が容易になります。ポリモーフィズムを実現するには、静的ポリモーフィズムと動的ポリモーフィズムの 2 つの方法があります。静的ポリモーフィズムは関数のオーバーロードによって実現され、動的ポリモーフィズムは仮想関数によって実現されます。CircleCircledraw()Circle

静的ポリモーフィズムは、コンパイル時に関数の呼び出しを決定することであり、関数のオーバーロードは静的ポリモーフィズムの形式です。例えば:

 void print(int a) {
   // 实现代码
 }
 
 void print(float b) {
   // 实现代码
 }
复制代码

上記の例では、2 つの関数を定義しましたprint()。1 つは整数の引数を取り、もう 1 つは float の引数を取ります。print()関数を呼び出すとき、コンパイラは、渡された引数の型に基づいて呼び出す関数を決定します。

动态多态是在运行时确定函数的调用。虚函数是动态多态的一种形式。在使用虚函数时,可以将基类指针或引用指向派生类对象,这样就可以实现多态性调用。例如:

 Shape* s = new Circle();
 s->draw(); // 调用Circle类中的draw()函数
复制代码

在上面的例子中,我们使用基类指针s来访问Circle类的对象,因为Circle类重写了draw()函数,所以调用的是Circle类中的实现。这种行为称为运行时多态性,因为实际调用的函数是在运行时确定的。

多态的底层原理

在C++中,多态是通过虚函数表和虚指针来实现的。虚函数表是一个特殊的表格,其中包含了虚函数的地址。每个类都有一个虚函数表,其中包含了该类及其基类的虚函数地址。当一个对象被创建时,它将包含一个指向其类的虚函数表的指针,称为虚指针。当调用一个虚函数时,程序将首先查找该对象的虚指针,然后使用虚指针中的虚函数表来查找正确的函数地址。这种方法使得程序在运行时能够动态地选择正确的函数。

多态性的好处

多态性可以使代码更加灵活、可扩展和易于维护。多态性可以使代码更加通用,可以使同样的代码适用于不同的对象。多态性可以提高代码的复用性,可以减少代码的重复编写。多态性可以使代码更加易于维护,因为代码可以更加清晰、简洁和易于理解。

在实际编程中,多态性也是非常有用的。例如,我们可以使用多态性来编写一个通用的排序函数,该函数可以对不同类型的数据进行排序。另一个例子是图形界面编程,我们可以使用多态性来处理不同的用户输入事件。

总结

虚函数是实现多态性的关键,它允许不同的对象表现出不同的行为。当使用基类指针或引用来访问派生类对象时,虚函数将调用派生类中的实现,实现了运行时多态性。在面向对象的编程中,多态性是一个非常重要的概念,可以使代码更加灵活、可扩展和易于维护。多态性有两种形式:静态多态和动态多态。静态多态是通过函数重载实现的,而动态多态是通过虚函数实现的。虚函数的底层原理可以参考我之前的帖子,有详细的介绍,这里不做多展开。最后,多态性可以使代码更加通用、易于维护和提高复用性。

おすすめ

転載: juejin.im/post/7230303948924551229