C++ 通过基指针获取派生类?

C++ 通过基指针获取派生类?,c++,polymorphism,derived-class,C++,Polymorphism,Derived Class,早在我的对象被声明在堆上而不是堆栈上时,我就可以发誓这是有效的。我有一个函数,它接受指向基类的指针(detail::DuplicateFn)。-虽然这是一个虚拟类,但实际的指针是由派生类给出的(即dteail::SkipFn) 1>GMProject.cpp(298):错误C2664: 'void xml_tree::combine_if(常量xml_tree&,谓词,常量细节::DuplicateFn*): 无法将参数3从'detail::SkipFn(uu cdecl*)(void)'转换为

早在我的对象被声明在堆上而不是堆栈上时,我就可以发誓这是有效的。我有一个函数,它接受指向基类的指针(detail::DuplicateFn)。-虽然这是一个虚拟类,但实际的指针是由派生类给出的(即dteail::SkipFn)

1>GMProject.cpp(298):错误C2664:
'void xml_tree::combine_if(常量xml_tree&,谓词,常量细节::DuplicateFn*):
无法将参数3从'detail::SkipFn(uu cdecl*)(void)'转换为'const detail::DuplicateFn*'
我的职能:

void GMProject::CombineTree(const pTree& Other) {
    detail::SkipFn foo();
        ProjectTree.combine_if(Other, &SimilarTreeValue<GMProject::pTree>, &foo);
}
void GMProject::CombineTree(const pTree&Other){
细节::SkipFn foo();
ProjectTree.combine_if(其他、类似和foo);
}
其中ProjectTree.combine_if()作为第三个参数需要指向“DuplicateFn”的指针,SkipFn是从DuplicateFn派生的

如前所述,如果我在堆上声明“foo”,那么这是正确的(正如我所期望的)。但是,当在堆栈上声明foo(或者最终使foo成为临时对象)时,情况并非如此。为什么呢

detail::SkipFn foo();
foo
不是对象。它是一个返回类型为
detail::SkipFn
的函数。所以,不如试试看-

detail::SkipFn foo;   // Notice the removal of (). Google most vexing parse 
                      // for explanation.

foo
不是对象。它是一个返回类型为
detail::SkipFn
的函数。所以,不如试试看-

detail::SkipFn foo;   // Notice the removal of (). Google most vexing parse 
                      // for explanation.

你的意思是谷歌“最烦人的解析”。+1。我以前从未考虑过这种模糊性,非常有趣。你每天都在学习:)啊-这一定是我第100次被这个“问题”抓住了。我很清楚这一点,但我一直犯这个错误。你的意思是谷歌“最烦人的解析”。+1。我以前从未考虑过这种模糊性,非常有趣。你每天都在学习:)啊-这一定是我第100次被这个“问题”抓住了。我很了解,但我一直在错误地研究这个问题。也可以从C++ FAQ和C++ FQA中看到。也可以从C++ FAQ和C++ FQA中看到。