我的一个朋友今天早些时候向我发出了以下挑战:
给定以下代码,请提出 OBJECT_HAS_VTABLE 的一种实现,使程序打印 "AnObject has a vtable = 0, AnObjectWithVTable has a vtable = 1"。
给定以下代码,请提出 OBJECT_HAS_VTABLE 的一种实现,使程序打印 "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。