2011-09-19 58 views
1

在我FileProc类,我有四个功能:子类递归方法调用

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

这些都是应该调用一个集中的方法(它们转换成):

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

有关背景信息类的层次结构如下:

TemplateList - > CharList
TemplateLis笔 - > TemplateListAdv
CharList - > CharListAdv
TemplateList - > TemplateListEditor
FileBasic - > 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

嵌入它有点困难。我会尽力。但基本上,编译器以某种方式将TemplateListEditor翻译成TemplateList ... aha ...复制构造函数不是显式的......我希望它们不是......(对不起,它们是明确的,同样的问题。 ) – SSight3

回答

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 
} 

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

+0

谢谢。这就是我的意思。我试图制作示例代码,但它的行为不像FileProc类中的问题。但这就是我的意思。是。谢谢。 – SSight3

+0

基本上,B正被传递给期望B的函数,但B正被转换为A,A调用将A转换为B的A函数,以便它可以调用B函数(它自己循环)。转换是隐含的,所以我不知道如何让它做到正确。 Arrgggh压力。 – SSight3

+0

对不起,Oli,static_cast(像typecast)没有为我工作。它仍然将TemplateListEditor转换为TemplateList。 – SSight3