子类递归方法调用

时间:2011-09-19 23:47:19

标签: c++ class methods recursion subclass

在我的FileProc类中,我有四个函数:

ReadFile(TemplateList<char> &ReadList){}
ReadFile(TemplateListAdv<char> &ReadList){}
ReadFile(CharList &ReadList){}
ReadFile(CharListAdv &ReadList){}

所有这些都应该称为集中式方法(它们被转换为):

ReadFile(TemplateListEditor<char> &ReadList){} //Contained by FileBasic

对于背景信息,类层次结构如下:

  

TemplateList - &gt; CharList
  TemplateList - &gt; TemplateListAdv
  CharList - &gt; CharListAdv
  TemplateList - &gt; TemplateListEditor
  FileBasic - &gt; FileProc

我的问题是有一个递归函数调用(其中TemplateList转换为TemplateListEditor将继续调用TemplateList函数),尽管类内部不同。类型转换似乎不起作用。如果不重命名函数(因为它应该是通用的,它会失败点),我如何让方法查找正确的方法?

(我很惊讶编译器从未标记出歧义解决错误。)

示例:

const bool ReadFile(TL::TemplateList<char> &ReadList, const bool Recursion = false)
{
    printf("Is recursion true? %d!\n",Recursion);
    TL::TemplateListEditor<char> Temp(ReadList);

    //Calls itself instead of
    //const bool ReadFile(TL::TemplateListEditor<char> &ReadList, const bool Recursion = false)
    if(!ReadFile(static_cast<TL::TemplateListEditor<char> &>(Temp),true ))
    {
        return false;
    }
    return true;
}

以上将输出:

  

递归是真的吗? 0
  递归是真的吗? 1
  递归是真的吗? 1
  等

让我感到震惊的是TemplateListEditor(尽管是静态演员等等)或某些令人难以置信的理由,被转换回TemplateList。编辑的构造函数都是明确的。

1 个答案:

答案 0 :(得分:1)

你的问题不是很清楚。但我假设你有类似的东西:

class A { ... };
class B : public A { ... };

void readFile(A &a) { ... };

void readFile(B &b)
{
    readFile(b); // Recursive call
    readFile(static_cast<A&>(b));  // Non-recursive call
}

函数重载在编译时确定,而不是在运行时确定。编译器尝试根据参数的 static 类型找到最佳匹配。