通过基指针获取派生类

getting derived class by base pointer?

本文关键字:派生 获取 指针      更新时间:2023-10-16

当我的对象在堆上而不是在堆栈上声明时,我可以发誓这是有效的。我有一个函数,它接受一个指向基类的指针(detail::DuplicateFn)。-虽然这是一个虚拟类,但实际指针是由派生类(即detail::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(或最终使foo成为临时变量)时,它不会这样做。为什么呢?

detail::SkipFn foo();

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

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

List x;and List x();?