最終更新:2026-10-12
C++ 純粋仮想関数と抽象クラス¶
著者について:¶
個人公式アカウント:

1.純粋仮想関数と抽象クラス¶
C++における純粋仮想関数(抽象関数)とは、実装を持たない仮想関数です!宣言だけでよく、宣言の中で0を代入することで純粋仮想関数を宣言します!
- 純粋仮想関数:関数本体を持たない仮想関数
- 抽象クラス:純粋仮想関数を含むクラス
抽象クラスは新しいクラスを派生させるための基底クラスとしてのみ使用でき、抽象クラスのオブジェクトを生成することはできません。抽象クラスのポインタと参照が指すのは、抽象クラスから派生したクラスのオブジェクトです!
2.抽象クラスの実装¶
抽象クラスでは、メンバ関数内で純粋仮想関数を呼び出すことはできますが、コンストラクタ/デストラクタの内部で純粋仮想関数を使用することはできません。
抽象クラスから派生したクラスは、基底クラスのすべての純粋仮想関数を実装してはじめて、非抽象クラスになることができます。
// A为抽象类
class A {
public:
virtual void f() = 0; // 纯虚函数
void g(){ this->f(); }
A(){} // 构造函数
};
class B : public A{
public:
void f(){ cout<<"B:f()"<<endl;} // 实现了抽象类的纯虚函数
};
コード例:abstract.cpp
3.重要なポイント¶
-
コンストラクタは仮想関数にできませんが、デストラクタは仮想デストラクタにできます
// 抽象类 class Base { public: Base(){ cout << "Constructor: Base" << endl; } virtual ~Base(){ cout << "Destructor : Base" << endl; } virtual void func() = 0; }; class Derived: public Base { public: Derived(){ cout << "Constructor: Derived" << endl; } ~Derived(){ cout << "Destructor : Derived" << endl;} void func(){cout << "In Derived.func()." << endl;} };基底クラスのポインタが派生クラスのオブジェクトを指していて、そのオブジェクトを削除するとき、適切なデストラクタが呼ばれることが望まれます。 デストラクタが仮想でない場合、基底クラスのデストラクタしか呼ばれません。
4.完全な例¶
抽象クラスは派生クラスによって継承・実装されます!
コード例:derived_full.cpp
関連トピック¶
- C++ assert アサーション | C++那些事
- C++ ビットフィールド | C++那些事
- C 言語による C++ 多態の実現 | C++那些事
- C++ const 定数と修飾 | C++那些事
- C++ const ファミリー | C++那些事
- C++ 間接参照演算子 * | C++那些事
- C++ 初期化と代入 | C++那些事
- C++ 複数戻り値の書き方 | C++那些事
- C++ mutable キーワード | C++那些事
- C++ restrict とコンパイル最適化 | C++那些事