コンテンツにスキップ

C++/純粋仮想関数

出典: フリー教科書『ウィキブックス(Wikibooks)』
< C++

純粋仮想関数とは

[編集]

純粋仮想関数は、C++の抽象クラスを定義する際に使用される機能です。派生クラスでの実装を強制する関数宣言で、インターフェースの設計に不可欠な要素となっています。

主な特徴

[編集]
  • クラス内で1つでも純粋仮想関数を含むと、そのクラスは抽象クラスとなる
  • 抽象クラスはインスタンス化できない
  • すべての純粋仮想関数を実装した派生クラスのみがインスタンス化可能

構文と基本的な使い方

[編集]

宣言方法

[編集]

純粋仮想関数は以下の構文で宣言します:

class Interface {
public:
    virtual ReturnType functionName(Parameters...) = 0;
    virtual ~Interface() = default;  // C++11以降推奨
};

実装例

[編集]

一般的な使用例:

class Shape {
public:
    virtual double area() const = 0;
    virtual double perimeter() const = 0;
    virtual ~Shape() = default;
};

class Circle final : public Shape {
private:
    double radius;
public:
    explicit Circle(double r) : radius{r} {}
    
    double area() const override {
        return std::numbers::pi * radius * radius;  // C++20
    }
    
    double perimeter() const override {
        return 2 * std::numbers::pi * radius;
    }
};

モダンC++での活用

[編集]

ベストプラクティス

[編集]
  • overrideキーワードを必ず使用(C++11以降)
  • デストラクタはdefault指定を推奨
  • 必要に応じてfinalキーワードを活用
  • std::unique_ptrなどスマートポインタの使用

インターフェース設計

[編集]
class Drawable {
public:
    virtual void draw(const Canvas&) const = 0;
    virtual void update() = 0;
    virtual ~Drawable() = default;
protected:
    Drawable() = default;  // インターフェースの継承のみを許可
};

実践的な使用例

[編集]

ストラテジーパターン

[編集]
class PaymentStrategy {
public:
    virtual bool process(double amount) = 0;
    virtual ~PaymentStrategy() = default;
};

class CreditCardPayment : public PaymentStrategy {
    bool process(double amount) override;
};

class PayPalPayment : public PaymentStrategy {
    bool process(double amount) override;
};

注意点と制限事項

[編集]
  • 純粋仮想関数を含むクラスはムーブ/コピー操作が暗黙的に削除される
  • STLコンテナには具象クラスを格納することを推奨
  • 仮想関数テーブルによるオーバーヘッドの考慮