由于CBase具有纯虚函数,因此无法创建它的实例。
在这种情况下,如何通过“novtable”产生违规?
如果没有办法,那么“novtable”应该应用于所有抽象类吗?
在此代码段中没有违反:
struct __declspec(novtable) CBase
{
virtual void f() = 0;
};
struct CSub: public CBase
{
CSub() { this->f(); }
void f() { printf("inside CSub::f()"); }
};
void TestVTable()
{
CBase* pBase = new CSub();
pBase->f();
}
最佳答案
为了解决这个问题,您需要“调用”虚拟机制。
首先,应动态创建对象,因为否则,将被调用的函数就是在对象类中定义的函数。在这种情况下-可以肯定的是CBase::f()
,因此不需要访问虚拟表。
其次,您需要显式调用该函数,因为如果调用来自构造函数,则可以肯定的是,在编译时f
是“已解析”的,所调用的f
函数将为CBase::f()
。因此,再次-这里不需要访问虚拟表。
因此,例如,要违反此规则,您需要“使用”虚拟机制,例如:
void TestVTable()
{
CBase* Base = new CBase();
Base->f();
}