我有类似的东西
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?
}
我非常困惑,为什么这不起作用,任何人都可以给我一些关于我应该做什么的建议????
聚苯乙烯。对不起,如果代码没有运行我把它放在那里例如sakes只是为了告诉你我在做什么
答案 0 :(得分:2)
您的代码中存在许多语法问题;
;
。我认为你所指的是拿一个成员函数指针并将它传递给一个方法是不行的。
问题在于您采用的方法只能使用D
进行调用,并尝试将其作为指向函数的指针传递给可以采用不是Base
的函数必须是D
。反过来会起作用(即将Base::createNew()
传递给一个D::createNew()
的函数,因为Base::createNew()
始终存在于D中,而不是相反)
答案 1 :(得分:1)
尝试:
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
内容。
答案 2 :(得分:1)
在代码中修复了一些简单的编译器错误之后
;
正文class
D:createNew
更改为D::createNew
D::createNew
说明符public
醇>
您的代码无法编译,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);