我理解的函数指针使用场景是在代码运行过程中,我们可以动态的选择和执行特定函数。函数指针需要定义函数的输入和输出类型,这和抽象类里面定义函数是一样的。
相对于抽象类,函数指针不需要很多代码去定义抽象类,只需要定义函数,可能更轻便。 但是我感觉函数指针的可读性和可维护性要更差一些,如果是大型项目也许抽象类是更好的实现方式?
不知道大家在实际中是怎么选择用抽象类还是函数指针。欢迎讨论!
函数指针代码示例
void my_int_func(int x)
{
printf( "%d\n", x );
}
int main()
{
void (*foo)(int);
foo = &my_int_func;
foo( 2 );
return 0;
}
抽象类代码示例
class AbstractClass {
public:
virtual void my_int_func(int) = 0;
class SomeClass:public AbstractClass {
public:
void my_int_func(int x){
printf( "%d\n", x );
}
}
int main()
{
AbstractClass a = SomeClass()
a.my_int_func(2);
return 0;
}
1
ysc3839 2022-10-25 11:02:50 +08:00
两者不等价,用函数指针的话就是一个函数指针。用抽象类且编译器使用虚函数表实现虚函数的话,那传进去的其实是虚函数表(里面是函数指针)+类指针。
|
2
vcfghtyjc OP @ysc3839 看到有说法说函数指针的内存开销会稍微好一点点。确实不等价,但我觉得抽象类可以在功能上取代函数指针,这个理解对吗?
|
3
ysc3839 2022-10-25 11:27:23 +08:00
如果是 C++,用函数指针的话可以直接写 lambda 函数,也可以用类的静态函数实现。用抽象类的话则不能直接写 lambda 。个人觉得是否用抽象类还得看项目的整体设计。
|
5
stein42 2022-10-25 14:15:16 +08:00 2
c++ 就用 std::function 。std::function 可以接受函数、方法、静态方法、lambda 表达式,只要参数和返回值类型匹配。
https://en.cppreference.com/w/cpp/utility/functional/function 抽象基类虽然功能上能实现,但是太啰嗦,对于每一种函数类型要定义一个基类,每一个函数要定义一个包装类。 而且运行时多一次查虚函数表的操作,同时也阻止了编译器优化。 函数指针仅仅是一个地址,不包含数据。std::function 还可以包含数据。 例如 lambda 表达式可以捕获外层的变量,形成一个闭包。这时就不能用函数指针了。 |