メインコンテンツにスキップ
モジュール 6 · レッスン 2 / 2コース内の 14/18~15 min
モジュールのレッスン (2/2)

ポリモーフィズムと仮想関数

ポリモーフィズム を使用すると、基本クラスへのポインターまたは参照を通じてさまざまな派生クラスのオブジェクトを扱うことができ、実行時に正しいバージョンのメソッドが確実に呼び出されるようになります (遅延バインディング)。

仮想関数: virtual および override

メソッドでポリモーフィズムを有効にするには、基本クラス内で virtual キーワードを使用してメソッドを宣言する必要があります。派生クラスでは、override 指定子を使用して、そのメソッドをオーバーライドしていることを明示的に示します。

C++
class Employee {
public:
    virtual void work() {
        std::cout << "Generic work" << std::endl;
    }
    // IMPORTANT: Virtual destructor in base class to avoid memory leaks
    virtual ~Employee() = default;
};

class Developer : public Employee {
public:
    void work() override {
        std::cout << "Writing C++ code" << std::endl;
    }
};

C++ は、基本クラスへのポインターを使用して、実行時に正しいメソッドを解決します。

C++
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;

抽象クラスと純粋な仮想関数

純粋仮想関数 は、最後に = 0 を付けて宣言された仮想メンバー関数です。これは正式な契約を表します。基本クラスは実装を提供せず、完全にサブクラスに委譲します。

少なくとも 1 つの純粋仮想関数を含むクラスは 抽象クラス と呼ばれ、直接インスタンス化することはできません。

C++
class Instrument {
public:
    virtual void play() = 0; // Pure virtual
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Playing piano..." << std::endl;
    }
};

自分で試してみてください

運動#cpp.m6.l2.e1
試行回数: 0読み込み中…

Animal で「Some sound」を出力する仮想メソッド makeSound() を定義します。次に、オーバーライド指定子を使用して Cat クラスでこれをオーバーライドし、「Meow」を出力します。

エディターを読み込み中…
ヒントを表示

基本クラスのメソッドの先頭に「virtual」を追加し、派生クラスのパラメーターの括弧の後に「override」を配置することを忘れないでください。

3 回の試行後に解決策が利用可能になります

運動#cpp.m6.l2.e2
試行回数: 0読み込み中…

抽象クラス Printable 内で void を返す純粋仮想関数 print() を宣言します。次に、Printable をパブリックに継承し、「Printing Document」を印刷する print() メソッドを実装する Document クラスを作成します。

エディターを読み込み中…
ヒントを表示

純粋仮想関数は、シグネチャ `virtual void print() = 0;` で宣言されます。 「Document」が「Printable」からパブリックに継承されていることを確認します。

3 回の試行後に解決策が利用可能になります