2011-11-05 48 views
0

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

+0

它必须是C中的函数指针吗?或者,这是关于传递函数的所有实例作为一流的值? – delnan

+2

@Xavier - 你为什么认为虚拟机制对开发人员来说很容易出错? – Mahesh

+1

给出一个你可以使用的场景,我们将指出利弊,在目前的形式下,这个问题没有任何真正意义。投票结束。 –

回答

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