我有一种情况,我需要在没有 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
}
};