2016-06-03 14 views
0

Я пытаюсь сделать что-то очень похожее на это. Я, вероятно, недопонимаю какое-то фундаментальное правило программирования, но любая помощь в понимании того, почему это не работает, будет оценена по достоинству. Мне также нравятся подсказки о том, как я мог бы сделать что-то подобное:Рекурсия C++ через дерево наследования с typeid вызывает проблемы с указателем

Чтобы быть ясным, я бы хотел вызвать C.RecursiveMethod(), чтобы затем вызвать B.RecursiveMethod(), который затем вызывает A.RecursiveMethod() который затем попадает в базовый регистр и так распутывается. На самом деле происходит C.RecursiveMethod() вызывает C.RecursiveMethod(), который вызывает C.RecursiveMethod() до конца света.

Спасибо заранее, и извините, если я сосать, это мой первый пост.

class A 
{ 
    void RecursiveMethod() 
    { 
     if (typeid(*this) == typeid(A)) 
      // Base case 
     else 
      SUPER::RecursiveMethod() // The problem lies here 

     // Do stuff 
    }; 
}; 

class B : A 
{ 
    typedef A SUPER; 
}; 

class C : B 
{ 
    typedef B SUPER; 
}; 

A.RecursiveMethod(); // Works, base case only 
C.RecursiveMethod(); // Infinite loop 
         // this pointer is always of type C 

// Also tried in vain: 
// this->SUPER::RecursiveMethod() 
// SUPER* superCast = dynamic_cast<SUPER*>(this); superCast->RecursiveMethod(); 
+0

Нет «A ... B ... C ... RecursiveMethod'. Существует только один «рекурсивный метод», который разделяется между ними. И так как 'this' никогда не изменяется (т. Е.' Typeid (* this) 'всегда одно и то же), вы получаете бесконечный цикл. – freakish

ответ

0

Вам необходимо создать перегрузки для RecursiveMethod() для всех ваших классов. Как ни странно, ваш указатель: if (typeid(*this) == typeid(A)) всегда указывает на тот же класс, следовательно, бесконечный цикл

+0

Спасибо за ваш вклад. «Красота» того, что я пыталась сделать здесь, заключалась в том, чтобы избежать повторения этого кода в каждом классе. Я надеялся, что это может быть способ сделать это. – DisplayName

+0

Я не совсем понимаю, что именно вы пытаетесь сделать здесь: «вызов C.RecursiveMethod(), чтобы затем вызвать B.RecursiveMethod(), который затем вызывает A.RecursiveMethod(), который затем попадает в базовый регистр, и поэтому распутывает «. –

+0

@ Chiralmaera вы смогли решить эту проблему еще ?? –

 Смежные вопросы

  • Нет связанных вопросов^_^