11:オーバーロード

はじめに

この章では、関数の「オーバーロード(overload)」について学びます。 オーバーロードとは、同じ名前の関数を引数の型や数を変えて複数定義できる仕組みです。


オーバーロードの基本

// 11_function_overload.cpp
#include <iostream>
using namespace std;

void print(int n) {
    cout << "整数: " << n << endl;
}

void print(string s) {
    cout << "文字列: " << s << endl;
}

int main() {
    print(10);
    print("Hello");
    return 0;
}

同じ関数名 print が2回定義されていますが、引数の型が違うため区別されます。 実引数と仮引数の一致するものが呼び出されます。


引数の数が違う例

// 11_function_overload_args.cpp
#include <iostream>
using namespace std;

void greet() {
    cout << "こんにちは!" << endl;
}

void greet(string name) {
    cout << "こんにちは、" << name << " さん!" << endl;
}

int main() {
    greet();
    greet("Tanaka");
    return 0;
}

同じ関数名 greet が2回定義されていますが、引数の数が違うため区別されます。 実引数と仮引数の一致するものが呼び出されます。


クラス内でのオーバーロード

// 11_class_method_overload.cpp
#include <iostream>
using namespace std;

class Calc {
public:
    int add(int a, int b) {
        return a + b;
    }

    double add(double a, double b) {
        return a + b;
    }
};

int main() {
    Calc c;
    cout << c.add(3, 5) << endl;
    cout << c.add(2.5, 1.5) << endl;
    return 0;
}

理解度チェック

問題1(11_overload_test1.cpp)
#include <iostream>
using namespace std;

void show(int n) {
    cout << "整数: " << n << endl;
}

void show(double d) {
    cout << "実数: " << d << endl;
}

int main() {
    show(5);
    show(3.14);
    return 0;
}
正解・解説を見る
整数: 5
実数: 3.14

演習問題

演習1(11_calc_all.cpp)

Calc クラスを定義し、次の3つの add 関数をオーバーロードで定義しなさい:

main関数でそれぞれを試すこと。

解答例を見る
// 11_calc_all.cpp
#include <iostream>
using namespace std;

class Calc {
public:
    int add(int a, int b) {
        return a + b;
    }

    double add(double a, double b) {
        return a + b;
    }

    string add(string a, string b) {
        return a + b;
    }
};

int main() {
    Calc c;
    cout << c.add(1, 2) << endl;
    cout << c.add(1.5, 2.5) << endl;
    cout << c.add("Hello, ", "World!") << endl;
    return 0;
}

まとめ