vtable なしでポリモーフィズムを達成する必要がある状況があります。これが私がやろうとしていることです
- クラス階層があります: C は B を拡張し、B は A を拡張します
- アイデアは、A で関数ポインターを宣言し、B と C のコンストラクターが対応するメソッドを A の関数ポインターに割り当てることです。
- 以下のコードでは、クラス C のポリモーフィズムを実現できますが、クラス B のポリモーフィズムは実現できません。
明らかに、ここで何かが欠けています。これが可能かどうかはわかりません。この問題についての洞察をいただければ幸いです。
以下のコードでこれを行うことができます
A<C> *c = new C();
c->BasePrint(); //Reached C's Print
しかし、これではありません
// A<B> *b = new B();
// b->BasePrint(); //Intentionally incorrect to demonstrate the problem.
これを達成する方法はありますか?
template <typename T>
class A
{
public:
typedef void (T::*PrintFn)(void);
protected:
PrintFn printFn;
public:
void BasePrint()
{
if(printFn)
(((T*)this)->*printFn)();
}
};
template <typename T>
class B : public A<T>
{
public:
B()
{
printFn = &B::Print;
}
void Print()
{
//Print B
}
};
class C : public B<C>
{
public:
C()
{
printFn = &C::Print;
}
void Print()
{
//Print C
}
};