C++/純粋仮想関数
< 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コンテナには具象クラスを格納することを推奨
- 仮想関数テーブルによるオーバーヘッドの考慮