インターフェイスと使いやすさを目的として、抽象基本クラスを使用したいと考えています。この抽象基本クラスは、いくつかの異なる派生クラスの親クラスとして使用されます。各派生クラスには、抽象基本クラスの純粋仮想関数の特定のサブセットが必要です。私のスキームの概要は以下の通りです。
抽象クラス.hpp
AbstractClass{
/* Declaration */
void pureVirt1() = 0;
void pureVirt2() = 0;
void pureVirt3() = 0;
};
派生クラス1.hpp
DerivedClass1{
/* Declaration */
void pureVirt1();
};
派生クラス2.hpp
DerivedClass2{
/* Declaration */
void pureVirt2();
};
派生クラス3.hpp
DerivedClass3{
/* Declaration */
void pureVirt3();
};
現在の実装では、上記のクラスはすべて抽象クラスであり、これらのクラスからオブジェクトを作成することはできません。過去に、私はこの問題を各仮想関数の周りのプリプロセッサ ディレクティブで解決しました。
抽象クラス.hpp
AbstractClass{
#ifdef _1
void purVirt1()=0;
#endif
...
そして、各派生クラスのヘッダー ファイルの先頭で、abstractclass.hpp へのインクルードの前に、次のように記述します。
派生クラス1.hpp
#define _1
#include"abstractclass.hpp"
...
これは、小さなプロジェクトで作業していて、make ファイルを作成していないときに機能しました。抽象クラスのヘッダーは、ディレクティブを正しい場所に保持している限り、どの派生クラスがそれを使用しているかに基づいて効果的に変更されました。メイクファイルを使用しているため、これは機能しません。abstractcalss.cpp は、派生クラスとは別にコンパイルされるため、ヘッダー ファイルに仮想関数を含めずにコンパイルされます。これに対する適切な回避策を探しています。
この機能が欲しいのは、私が作成した他のさまざまなツールで使用される、この抽象基本クラスからの同様の派生クラスが多数あるためです。これらの他のツールをできるだけシンプルに保ち、すべてのテンプレート クラスを記述する代わりに、抽象クラスへのポインターを使用するだけにしたいと考えています。
-- 詳細情報 AbstractClass が SubAbstractClass との has-a 関係にあり、AbstractClass に SubAbstractClass へのポインターを使用して実装されている状況があります。さらに、各派生クラスには、SubDerivedClass1、SubDerivedClass2 などと同様の has-a 関係があります。特に、派生クラスを組み合わせて新しいクラスを作成できるため、作成する新しいクラスごとにコンテナーを記述したくありません。これらは重要で機能的であり、そのような新しいクラスの組み合わせには、適切なサブクラスのセットを作成する必要があります。この目的のために、ABC を使用してポインターを一度宣言すれば、任意の派生クラスで機能すると便利です。