Подкласс рекурсивного вызова метода - PullRequest
1 голос
/ 20 сентября 2011

В моем классе FileProc у меня есть четыре функции:

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

Все они должны вызывать централизованный метод (в который они преобразуются):

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

Для справочной информации иерархия классов выглядит следующим образом:

TemplateList -> CharList
TemplateList -> 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 Ответ

1 голос
/ 20 сентября 2011

Ваш вопрос не очень понятен. Но я предполагаю, что у вас есть что-то вроде этого:

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 .

...