虚拟函数比函数指针更安全吗?更安全的话,我的意思是开发人员不太容易出错。如果他们更安全,请解释如何。虚拟函数比函数指针更安全吗?
0
A
回答
1
虚拟功能可以保护您免受一个常见错误的影响:分派机制处于隐藏状态,因此您无法使用不适合的对象调用虚拟功能。请看下面的代码:
struct Base {
int (*p)(Base*);
};
struct Derived {
Derived() { Base::p = &Derived::my_p_implementation; }
};
的my_p_implementation将依靠被称为具有指针的派生的第一个参数的实例,但通过做手工调度,你有一千种方式来传递不同的基指向my_p_implementation的指针。因此,虚拟函数更安全,因为它们不允许这种外部调度。
1
实际上,虚拟函数实际上是作为函数指针实现的,这些函数指针被分组到C++类的每个实例的vtable中(所以对于单继承类层次结构,指向vtable的指针是每个隐藏的第一个字段C++类)。 vtable-s由编译器管理。
使用C++有一个小优点:编译器(或链接器)会在vtable中的函数指针未定义时给您一个错误。如果你在C中通过一个包含函数指针的类似结构(例如Gtk Gobject正在做),你不会得到这个额外的编译时检查。此外,在极少数情况下,g ++编译器能够虚拟化这些调用(通过用直接调用来代替间接调用)。
但是vtable由函数指针组成。令人遗憾的是,在C++中,没有办法拥有虚拟数据(类似于其他许多对象语言中的类变量)。
相关问题
- 1. 指向虚拟成员函数的指针是否可比?
- 2. 指针到虚拟成员函数
- 3. 纯虚拟方法VS.函数指针
- 4. 虚拟函数调用比dynamic_cast慢吗?
- 5. 函数指针和虚函数
- 6. 虚函数 - 基类指针
- 7. 通过指向const的指针调用虚拟函数基类
- 8. 基类指针指向正常和虚拟函数
- 9. 虚拟函数可以被非虚函数覆盖吗?
- 10. c函数指针反函数指针
- 11. 在被调用的函数中更改函数指针(std :: function)是否安全?
- 12. 函数指针指向一个函数指针的函数
- 13. 写入(函数原型,函数指针,外部指针)更小
- 14. 嵌套函数比Python中的全局函数更快吗?
- 15. 虚拟函数C++
- 16. 虚拟函数C#
- 17. 函数指针/函数表
- 18. 局部指针指向全局函数
- 19. 正确的指针,虚函数表
- 20. 虚拟函数+带基类指针的STL容器
- 21. 具有智能指针的虚拟构造函数成语
- 22. 函数指针:物理地址或虚拟地址
- 23. 新的,共享指针和虚拟函数
- 24. 虚拟函数表指针的大小是多少?
- 25. VS-2010中的函数指针(+虚拟Alloc调用)
- 26. c + +交换与成员函数指针与虚拟继承
- 27. 函数指针
- 28. 函数指针
- 29. 函数指针
- 30. 函数指针
它必须是C中的函数指针吗?或者,这是关于传递函数的所有实例作为一流的值? – delnan
@Xavier - 你为什么认为虚拟机制对开发人员来说很容易出错? – Mahesh
给出一个你可以使用的场景,我们将指出利弊,在目前的形式下,这个问题没有任何真正意义。投票结束。 –