C++ での関数のオーバーロード VS オーバーライド
胡金庫
2023年10月12日
この記事では、C++ での関数のオーバーロードとオーバーライドの違いを紹介します。
C++ で関数のオーバーロードを使用して異なるパラメータリストを持つ複数の関数を定義する
関数のオーバーロードは C++ 言語の機能であり、同じ名前の複数の関数を使用できます。これらの関数は、パラメーターが異なり、1つのスコープに配置されています。一般に、オーバーロードされた関数は非常によく似た操作を実行し、それらに単一の関数名を定義し、複数のパラメーターセットでインターフェイスを公開するのは直感的です。この場合、printNumAcu
という名前の 3つの関数を持つ Planet
という名前のクラスを定義しました。これらの関数はすべて異なるパラメーターを持ち、コンパイル時に区別されます。オーバーロードされた関数は、異なるパラメータータイプまたは異なる数のパラメーターを持っている必要があることに注意してください。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class Planet {
private:
int num{};
public:
explicit Planet(int i) : num(i) {}
void printNumAcu() const { cout << num * num << endl; }
void printNumAcu(int x) const { cout << num * num * x << endl; }
void printNumAcu(int x, int y) const { cout << num * num * x * y << endl; }
};
int main() {
Planet m1(3);
m1.printNumAcu();
m1.printNumAcu(3);
m1.printNumAcu(3, 3);
return EXIT_SUCCESS;
}
出力:
9
27
81
関数のオーバーライドを使用して、C++ の派生クラスの継承されたメンバーを再定義する
関数のオーバーライドは、派生クラスとその継承に関連する機能です。通常、派生クラスはすべての基本クラスメンバーを継承し、一部は派生クラスで再定義されてカスタムルーチンを実装します。ただし、基本クラスは、オーバーライドされることになっているメンバー関数を指定する必要があることに注意してください。これらのメンバー関数は仮想関数と呼ばれ、定義に virtual
というキーワードも含まれています。定義する必要のない仮想関数の一種である純粋仮想関数の概念もあります。純粋仮想関数を(オーバーライドせずに)含むまたは継承するクラスは、抽象基本クラスと呼ばれ、通常、オブジェクトの作成には使用せず、他のクラスを派生させる必要があります。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class Planet {
protected:
int num{};
public:
explicit Planet(int i) : num(i) {}
virtual void printName() = 0;
};
class Mars : public Planet {
public:
explicit Mars(int i) : Planet(i) {}
void printName() override { cout << "Name's Mars " << num << endl; }
};
class Earth : public Mars {
public:
explicit Earth(int i) : Mars(i) {}
void printName() override { cout << "Name's Earth " << num << endl; }
};
int main() {
Earth e1(3);
e1.printName();
Mars m1 = e1;
m1.printName();
return EXIT_SUCCESS;
}
出力:
Name's Earth 3
Name's Mars 3
著者: 胡金庫