通过基指针获取派生类?

时间:2011-11-27 11:48:01

标签: 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 *'

我的功能:

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

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

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

1 个答案:

答案 0 :(得分:6)

detail::SkipFn foo();

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

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

Is there any difference between List x; and List x();?