由于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();
}

09-25 20:41