昨日、私はいくつかのコードを書きました。これが良い習慣なのか悪い習慣なのか、判断していただければ幸いです。そして、それが悪い場合、何がうまくいかない可能性があります。
コンストラクトは次のとおりです。
基本クラス A は、悲しいことにテンプレートとして API から取得されます。目標は、A からの派生クラスを std::vector に配置できるようにすることでした。A から継承するすべての派生クラスが継承する基本クラス B でこれを実現しました。B の純粋仮想関数がなければ、A の foo() 関数が呼び出されました。
B の純粋仮想関数では、C の foo() バージョンが呼び出されます。これはまさに私が欲しいものです。
それで、これは悪い習慣ですか?
編集:
サンプルコードの誤解を解くには:
template <class T>
class A
{
public:
/* ctor & dtor & ... */
T& getDerived() { return *static_cast<T*>(this); }
void bar()
{
getDerived().foo(); // say whatever derived class T will say
foo(); // say chicken
}
void foo() { std::cout << "and chicken" << std::endl; }
};
class B : public A<B>
{
public:
/* ctor & dtor */
virtual void foo() = 0; // pure-virtual
};
class C : public B
{
public:
/* ctor & dtor */
virtual void foo() { std::cout << "cow"; }
};
class D : public B
{
public:
/* ctor & dtor */
virtual void foo() { std::cout << "bull"; }
};
std::vector には、C と D の両方が含まれます。
void main()
{
std::vector<B*> _cows;
_cows.push_back((B*)new C()));
_cows.push_back((B*)new D()));
for(std::vector<B*>::size_type i = 0; i != _cows.size(); ++i)
_cows[i].bar();
}
出力あり
cow and chicken
bull and chicken
が望まれます。
私の知る限り、テンプレート クラスから派生したクラスをコンテナーに格納するには、基本クラスを使用する以外に方法はありません。派生クラスに基本クラスを使用する場合、たとえば、B i はベクトル内のすべてのインスタンスを適切なクラスにキャストする必要があります。しかし、bar() が呼び出された時点では、正確な型はわかりません。