通过基指针获取派生类?

pau*_*l23 0 c++ polymorphism derived-class

我可以在前一段时间宣誓这个工作,当我的对象在堆上而不是在堆栈上声明时.我有一个函数,它接受一个指向基类的指针(detail :: DuplicateFn). - 虽然因为这是一个虚拟类,实际的指针是由派生类给出的(即dteail :: SkipFn)

1>GMProject.cpp(298): error C2664:
'void xml_tree<V>::combine_if<bool(__cdecl *)(const T &,const T &)>(const xml_tree<V> &,Predicate,const detail::DuplicateFn *)' :
cannot convert parameter 3 from 'detail::SkipFn (__cdecl *)(void)' to 'const detail::DuplicateFn *'
Run Code Online (Sandbox Code Playgroud)

我的功能:

void GMProject::CombineTree(const pTree& Other) {
    detail::SkipFn foo();
        ProjectTree.combine_if(Other, &SimilarTreeValue<GMProject::pTree>, &foo);
}
Run Code Online (Sandbox Code Playgroud)

ProjectTree.combine_if()作为第三个参数需要指向"DuplicateFn"的指针 - 而SkipFn是从DuplicateFn派生的.

如上所述,如果我在堆上声明"foo",它会正常工作(就像我期望的那样).然而,当在堆栈上声明foo时(或者-ultimatelly-使foo成为临时)它不会.这是为什么?

Mah*_*esh 6

detail::SkipFn foo();
Run Code Online (Sandbox Code Playgroud)

foo不是一个对象.这是一个返回类型为的函数detail::SkipFn.所以,请尝试 -

detail::SkipFn foo;   // Notice the removal of (). Google most vexing parse 
                      // for explanation.
Run Code Online (Sandbox Code Playgroud)

List x之间有什么区别; 和列表x();?