虚函数比函数指针更安全吗?更安全我的意思是开发人员不容易出错。如果它们更安全,请解释一下。
答案 0 :(得分:1)
虚函数可以保护您免受一个常见错误的影响:调度机制被隐藏,因此您无法使用不合适的对象调用虚函数。请考虑以下代码:
struct Base {
int (*p)( Base* );
};
struct Derived {
Derived() { Base::p = &Derived::my_p_implementation; }
};
my_p_implementation将依赖于使用指向Derived实例的指针作为其第一个参数进行调用,但是通过手动执行调度,您有一千种方法可以将不同的Base指针传递给my_p_implementation。因此,虚拟函数更安全,因为它们不允许这种外部调度。
答案 1 :(得分:1)
虚拟函数实际上(经常)实现为函数指针,这些函数指针被分组到C ++类的每个实例的vtable中(因此,对于单继承类层次结构,指向vtable的指针是隐藏的第一个每个C ++类的字段)。 vtable-s由编译器管理。
使用C ++有一个小好处:当未定义vtable中的函数指针时,编译器(或链接器)将给出错误。如果你在C中通过一个包含函数指针的类似结构(比如例如Gtk Gobject正在做的那样),你就不会得到额外的编译时检查。此外,在极少数情况下,g ++编译器能够对这些调用进行虚拟化(通过用直接调用替换间接调用)。
但是vtable是由函数指针组成的。遗憾的是,在C ++中,没有办法拥有虚拟数据(类似于许多其他对象语言中的类变量)。