C++のコンストラクタは、仮想関数にはできません。そのため、C++用語での純粋仮想関数(pure virtual function, ここで言う抽象コンストラクタ)にはできません。
オブジェクトの構築を仮想にし、派生クラスで構築の動作をカスタマイズ(多態)したい場合は、コンストラクタの代わりとなるヘルパ関数を用意することになります。
たとえば、
- 仮想関数としての構築用メンバ関数を用意し、
- クラスのオブジェクトを作成する際には、構築用メンバ関数を呼び出すファクトリー関数を呼び出す
というようなものです:
cpp
1#include <iostream>
2#include <memory>
3
4class A {
5public:
6 virtual void initialize() = 0;
7};
8
9class B : public A {
10public:
11 void initialize() override
12 {
13 // 派生クラスごとの構築処理を行う
14 std::cout << "B" << std::endl;
15 }
16};
17
18class C : public A {
19public:
20 void initialize() override
21 {
22 std::cout << "C" << std::endl;
23 }
24};
25
26template <class T>
27std::shared_ptr<A> factory()
28{
29 A* x = new T();
30 x->initialize();
31 return std::shared_ptr<A>(x);
32}
33
34int main()
35{
36 std::shared_ptr<A> b = factory<B>();
37 std::shared_ptr<A> c = factory<C>();
38}
出力:
構築用メンバ関数であるinitialize()
を呼び出さずに構築されることを防ぐため、コンストラクタをprivateにして、ファクトリー関数をfriendにすることも検討するとよいでしょう。
このファクトリー関数とは、オブジェクト指向におけるデザインパターンの一種です。
##参照
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。