作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
因为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();
}
关于c++ - 如何在 MSVC 中生成由 'novtable' 引起的违规?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8205173/
我是一名优秀的程序员,十分优秀!