今天早些时候,我的一个朋友向我发送了以下挑战:
给定以下代码,提出
OBJECT_HAS_VTABLE
程序 print的实现AnObject has a vtable = 0, AnObjectWithVTable has a vtable = 1
。
class AnObject
{
int m_a;
void DoSomething() {}
public:
AnObject() {m_a = 0;}
};
class AnObjectWithVTable
{
int m_b;
virtual void DoStuff() { }
public:
AnObjectWithVTable() {m_b = 0;}
};
void main()
{
printf("AnObject has a vtable = %i, AnObjectWithVTable has a vtable = %i\n",
OBJECT_HAS_VTABLE(AnObject),
OBJECT_HAS_VTABLE(AnObjectWithVTable));
}
我想出了以下我认为足够体面的解决方案:
template <typename T>
bool objectHasVtable()
{
class __derived : public T {};
T t;
__derived d;
void *vptrT=*((void **)&t);
void *vptrDerived=*((void **)&d);
return vptrT != vptrDerived;
}
#define OBJECT_HAS_VTABLE(T) objectHasVtable<T>()
这个问题有更好的解决方案吗?
编辑
该解决方案不必在所有编译器中都是通用的。它可以在 gcc、g++、MSVC 上运行...只需指定您的解决方案对哪个编译器有效即可。我的适用于 MSVC 2010。