虚函数比函数指针更安全吗?

时间:2011-11-05 14:31:45

标签: c++ function-pointers virtual-functions

虚函数比函数指针更安全吗?更安全我的意思是开发人员不容易出错。如果它们更安全,请解释一下。

2 个答案:

答案 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 ++中,没有办法拥有虚拟数据(类似于许多其他对象语言中的类变量)。