vtable是仅用于虚拟函数查找,还是用于普通成员函数查找?什么时候使用vtable?
2
A
回答
9
从技术上讲,这是一个实现细节。 C++标准没有提到vtable或vptrs。
但通常,编译器只会在成员函数以多义意义被调用时(即通过指针/参考基类)调用vtable/vptr机制。如果它在编译时知道要做什么,那么就不需要间接方法。
3
仅适用于虚拟函数查找。非虚拟成员函数并不需要太多特殊 - 它只是一个正常函数,它将this
作为隐藏参数。
1
该标准并没有规定如何实现继承,所以一个vtable不一定存在。但据我所知,目前所有主要编译器都只使用vtable来调用虚拟函数。
1
dynamic_cast也会使用vtable,我相信。
0
据我所知,只有当被调用的方法被指定为虚拟时,vtable才会被创建(并因此被使用)。如果它是虚拟的,那么它将使用vtable,如果它不是虚拟的,那么它将被静态绑定。
这个确定是在编译时完成的。
-1
和方法指针查找。至少有一个检查指针是否指向虚拟成员函数。
0
这始终是实现相关的,但大多数编译器将使用虚函数表时:被称为
virtual
功能;- 当使用dynamic_cast地址的vtables被使用。实际的vtable没有被使用,但它必须存在有一个地址。
virtual
-y继承的类正在接受。
virtual
-y继承类访问包括虚拟和非虚拟方法调用,而且现场访问,甚至指针铸造
class foo{
public:
virtual void bar(){}
};
class foo2: public virtual foo{
public:
virtual void bar2(){}
};
int main(int argc, char *argv[])
{
foo2* f2= new foo2();
f2->bar();
foo* f1 = f2;
}
foo* f1 = f2;
线也将读取虚函数表(虽然首先检查会用于f2 == NULL,在这种情况下f1也将为NULL)。
相关问题
- 1. 什么时候应该使用AWS,什么时候不使用
- 2. intn_t什么时候使用它,什么时候不使用
- 3. 什么时候使用__proto__和什么时候使用原型
- 4. 什么时候使用Ruby和什么时候使用PHP
- 5. 什么时候使用uncaught_exception?
- 6. 什么时候使用sIFR?
- 7. JOINS什么时候使用?
- 8. 什么时候使用Dispose
- 9. 什么时候使用ANTLR
- 10. 什么时候使用StringIO?
- 11. Railties - 什么时候使用
- 12. 什么时候使用SpringApplicationBuilder?
- 13. 什么时候使用GWT,什么时候不需要
- 14. ZF2什么时候使用getServiceLocator()什么时候不到
- 15. SQL Server CASE什么时候不使用CASE什么时候
- 16. 什么时候使用信号和插槽,什么时候不使用
- 17. 什么时候应该使用Import-Package,什么时候应该使用Require-Bundle?
- 18. 什么时候使用适配器和什么时候使用inflater
- 19. 什么时候使用for-each和什么时候在xslt中使用apply-templates?
- 20. 什么时候适合使用双向关联,什么时候不适用?
- 21. 什么时候使用hash()调用__eq__?
- 22. 什么时候应该使用let {},什么时候只是简单的!= null
- 23. 目标C什么时候使用alloc和什么时候不到
- 24. 什么时候应该使用学说ORM和什么时候zend-db-table?
- 25. 什么时候调用setDataTimeout?
- 26. 什么时候用短?
- 27. 什么时候调用webview.clearData
- 28. 什么时候DataView可用?
- 29. 什么时候调用robot.cleanUp()
- 30. 什么时候ConcurrentSkipListSet有用?
支票?何时执行检查? –
编译器不知道什么是虚拟的,哪些不是虚拟的? –
当一个方法指针被调用时,最后一位被测试:如果它是1,它是一个指向虚方法的指针,否则它是一个指向成员函数的指针。你可以用objdump轻松地检查。你也可以检查成员函数指针的大小,它不仅是一个指针。实际上它是一个偏移+调用方法的vtable中的地址或索引。 – Thomas