【发布时间】:2013-03-22 16:54:39
【问题描述】:
我有一种情况,我需要在没有 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
}
};
【问题讨论】:
-
你能不能展示一些失败的测试用例?
-
这不是没有 vtable 的多态性。这是使用手动编码的 vtable 而不是编译器生成的 vtable 的多态性。我看不出有什么原因。
-
是的,我同意它是一种手工编码的 vtable。我确实有一种情况,我需要将大量代码库移植到不支持虚函数的编译器。试图找到一种聪明的方法来做到这一点。
-
@anumalla: 什么样的C++编译器不支持虚函数?
-
我认为即使是 20 多年前的 Tubro C++ 也支持虚函数。我不记得曾经发布过任何不支持虚函数的 C++ 编译器。即使是 80 年代的 Cfront,它是 C 语言的预处理器,也支持虚函数。
标签: c++ templates polymorphism virtual function-pointers