QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1032|回复: 8

[C++][指针]关于指向成员函数的指针~

[复制链接]
发表于 2004-8-17 16:49:10 | 显示全部楼层 |阅读模式
1.定义指向成员函数的指针可以这样:
type (class_name::*funcptr)(para_list);
所以定义一个这样的指针就必须事先知道那个class_name。
那么有什么办法可以定义一个指针,让它可以指向任意类的成员函数呢?

2.
[code:1]
class Base
{
public:
  int foo(int m);
}

class A : public Base
{
    int foo(int m);
    int plmm(int m);
}

main()
{
  int (A::*func1)(int);
  func1=&A::foo;
  int (A::*func2)(int);
  func2=&A::plmm;
  A mm;
  Base *qq;
  qq=&mm;
  qq->*func1(1);//会怎样?
  qq->*func2(1);//会怎样?
}
[/code:1]
发表于 2004-8-18 16:22:22 | 显示全部楼层
你为什么要抛开已经存在的设计方案?

想想虚函数的设计目的。
回复

使用道具 举报

发表于 2004-8-18 18:13:41 | 显示全部楼层
虚函数有vft要查,看编译实现,
有不同的复杂度.
楼主可能想类C的方式直接使用函数指针,
也许效率高些.但是代码写的不对.
func1... 不是成员函数.
要看出于什么要求和目的,
需要使用成员函数指针.
大多数情况有更好的替代设计方法.
回复

使用道具 举报

发表于 2004-8-18 21:19:58 | 显示全部楼层
  

C++

刚看完C
回复

使用道具 举报

 楼主| 发表于 2004-8-18 21:51:29 | 显示全部楼层
这个……大家有没有想过虚函数也有其局限性的……
虚函数,能通过基类调用的派生类的函数,那一定得是在基类里给出了接口的,所以假如派生类想增加一些基类里没有定义的函数,那么这些函数怎样才能使用基类指针来调用呢?
回复

使用道具 举报

发表于 2004-8-18 22:17:14 | 显示全部楼层
[quote:69790f3144="sjinny"]这个……大家有没有想过虚函数也有其局限性的……
虚函数,能通过基类调用的派生类的函数,那一定得是在基类里给出了接口的,所以假如派生类想增加一些基类里没有定义的函数,那么这些函数怎样才能使用基类指针来调用呢?[/quote]

你说的这个需求,呵呵。

首先,基类里定义虚函数的目的是它的实现子类的对象具有相同的动作(千万别和子类重载某个函数的作用搞混了),那个动作可以按照子类的具体情况有不同的行为。

注意,我说的相同的动作,具有相同动作的多个对象可以被认为属于某个类。

所以,如果基类指针可以使用它本来没有的动作,也就是类的定义被打破了,我只能说,这是设计的bug。

当然,实际情况可能真的会出现你说的需求,你也不应该用你提到的方法,而应该定义一个虚函数,由那个虚函数来调用具体的函数。

我的看法,你的方法即使能运行(虽然我认为根本就不可能,理由是c++里很多是逻辑指针而不是物理指针,你不可能通过逻辑指针引用到真正的物理地址),也只能算是一种黑客方法,在真正的开发中还是不用为妙。
回复

使用道具 举报

 楼主| 发表于 2004-8-18 22:17:37 | 显示全部楼层
其实我的想法是这样……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2004-8-18 22:20:11 | 显示全部楼层
这个……其实只是callback机制嘛……
回复

使用道具 举报

发表于 2004-8-19 09:20:26 | 显示全部楼层
我认为,你的最后一个要求(指向任意类的成员函数)是可以通过虚函数完成的,其实从编译器的角度来说,虚函数也应该是一些地址的指针,但是受类概念局限的函数指针。但是你所要求的指针定义完全是一个全局的函数指针,要想指向其它类的成员,其成员应该是静态的方法,否则在无实例的状况下,你定义的函数指针根本找不到你想要的方法的地址。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 15:44 , Processed in 0.040436 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表