函数成员指针

Function member pointers

本文关键字:指针 成员 函数      更新时间:2023-10-16

我有一些类似的东西

Base.h

#ifndef BASE_H
#define BASE_H
class Base
{
virtual Base* createNew() = 0;
}
#endif

D.h

#ifndef D_H
#define D_H
#include "Base.h"
class D : public Base
{
virtual Base* createNew();
}
#endif

D.cpp

#include "D.h"
Base* D:createNew()
{
return new D();
}

main.cpp

typedef Base* (Base::*FP)(void);
#include "D.h"
void create(FP pointer)
{
//empty for now
}
int main()
{
create(&D::createNew); //This doesnt work =s?
}

我非常困惑,为什么这不起作用?有人能给我一些建议吗????

Ps。很抱歉,如果代码没有运行,我把它放在那里只是为了向你展示我在做什么

您的代码中存在许多语法问题;

  • Base::createNew()是私有的和虚拟的
  • 两个类声明都没有终止的;
  • D: createNew()应该是D::createNew[()]。

不过,我认为您所指的是,获取成员函数指针并将其传递给方法是行不通的。

问题是,您正在使用一个只能用D调用的方法,并试图将其作为指向一个函数的指针来传递,该函数可以使用不一定是DBase。反之亦然(即将Base::createNew()传递给采用D::createNew()的函数,因为Base::createNew()总是存在于D中,而不是相反)

try:

 create(&Base::createNew);

毕竟,create想要一个指向成员的Base::*指针,而不是D::*。

对于指向成员的指针,我不认为继承行之间存在协方差;指向成员的Base::*类型指针与指向成员的D::*类型指针不兼容。

但是,您仍然可以通过指向D对象上成员的Base指针来调用D虚拟函数。D实际上是Base的一种,所以你可以做dinst->*pmemb,其中pmemb是一个&Base::createNew`。

此外

您的D::createNew可以返回D *。在C++中允许虚拟函数返回类型中的这种"协方差"。它仍然是覆盖Base中返回Base *的虚拟函数。当您直接调用D::createNew时,有时您可能会喜欢获得D *指针,这样您就可以使用D之类的东西。

在修复了代码中的以下琐碎编译器错误后,

  1. class正文后缺少;
  2. D:createNew更改为D::createNew
  3. public说明符中制作D::createNew

您的代码不能在create(&D::createNew)编译。因为它是不可兑换的。错误信息很清楚:

error: cannot convert ‘Base* (D::*)()’ to ‘FP {aka Base* (Base::*)()}’ 

编辑:一种方法是使用template评估,如果您决定在编译时进行评估。

template<typename ReturnType, typename Class>
void create(ReturnType (Class::*pointer)())
{
}

称之为:

create<Base*, D>(&D::createNew);