函数指针和虚函数

Wha*_*ght 1 c++ polymorphism

我想我的问题应该是愚蠢的,但我确实从未见过声明为虚拟的函数指针.是否有一个原因?

编辑:

我应该说:它指向的功能是否可能被指定为虚拟?

AnT*_*AnT 5

嗯,是(不).

普通函数指针不能指向非静态成员函数.它们只能指向独立函数,这就是为什么对于普通函数指针而言,函数虚拟性的问题甚至都没有出现在图片中.

为了指向C++中的成员函数,您需要一个特殊类型的指针:一个具有指向成员函数类型的指针.这种类型的指针也可以指向非虚拟成员函数和虚拟成员函数.如果要指向虚拟成员函数,则无需执行任何特殊步骤.例如

struct B { 
  virtual void foo() {} 
  void bar() {} 
};

...
B b;
void (B::*pfunc)(); // declare a pointer to a member function

pfunc = &B::foo; // make it point to `B::foo`
(b.*pfunc)(); // calls `B::foo` for object `b`

pfunc = &B::bar; // make it point to `B::bar`
(b.*pfunc)(); // calls `B::bar` for object `b`
Run Code Online (Sandbox Code Playgroud)

但是,当您将此指针指向虚拟成员函数时,您必须记住,它实际上并未绑定到类层次结构中该函数的特定版本.关于要调用的特定功能的决定是在呼叫点进行的.例如

// given the above `B`
struct D : B { 
  virtual void foo() {} 
};

...
void (B::*pfoo)(); // declare a pointer to a member function
pfoo = &B::foo; // and make it point to `B::foo`
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们做出来的指针pfoo指向B::foo.或者我们呢?实际上,指针并没有特别硬链接B::foo.这两个电话

B b;
D d;

(b.*pfoo)();
(d.*pfoo)();
Run Code Online (Sandbox Code Playgroud)

将调用两个不同的功能.第一个将调用B::fooobject b,而第二个将调用D::fooobject d,即使我们在两种情况下都使用相同的指针值.这实际上在许多应用程序中都有意义

然而,在某些低级别的情况下,拥有一个与特定版本的虚函数紧密相关的指针会很有用.也就是说,它会是不错的一个指针,将调用B::fooB对象的子对象d的时候,我们做

(d.*pfoo)();
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我们需要能够指定是否要提前(在初始化时)或延迟(在调用时)绑定它.不幸的是,C++语言没有提供这样的功能.