Почему эта программа зависает? - PullRequest
4 голосов
/ 04 июня 2010

У меня есть следующий код, который, кажется, ведет к бесконечному циклу:

struct X
{
  void my_func( int ) { std::cout << "Converted to int" << std::endl; }
};

struct X2 : X
{
  void my_func( char value ) { my_func(value); }
};

В чем проблема?

Ответы [ 7 ]

10 голосов
/ 04 июня 2010

Второй бит бесконечно рекурсивен:

struct X2 : X
{
  void my_func( char value ) { my_func(value); } //calls itself over and over again
};

Префикс my_func с именем базового класса, и вы будете в порядке

struct X2 : X
{
  void my_func( char value ) { X::my_func(value); }
};

РЕДАКТИРОВАТЬ Только что понял, что подпись базового класса my_func отличается. Компилятор C ++ разрешает перегрузку функции статически, это означает, что он выберет функцию, которая лучше всего соответствует типу аргумента, поэтому он вызывает перегрузку char.

Например:

char cChar = 'a';

myfunc(cChar);

void myfunc(char a){} //<-- this one is called
void myfunc(int a){}

int iInt = 1;

myfunc(iInt);

void myfunc(char a){} 
void myfunc(int a){} //<-- this one is called

Спасибо, Чарльз Бейли. Приведенный выше код не применяется в этом случае, поскольку X2 my_func скрывает базовый класс my_func. Это оставляет единственное решение для определения функции с именем класса.

2 голосов
/ 04 июня 2010
void my_func( char value ) { my_func(value); }

прямо сейчас, вы написали рекурсивную функцию без базового варианта. Я не слишком много знаю о C ++, но вам нужно как-то указать, что вы хотите вызывать my_func X, а не X2 (я предполагаю, что вы хотите это сделать.)

edit: Чтобы исправить это, вам нужно привести значение к int

2 голосов
/ 04 июня 2010
void my_func( char value ) { my_func(value); }

Вы передаете value, который равен char, поэтому он разрешает вызов того же метода с параметром char. Это становится бесконечной петлей.

0 голосов
/ 04 июня 2010

Вам необходимо явно вызвать функцию базового класса, т. Е .:

struct X
{
  void my_func( int ) { std::cout << "Converted to int" << std::endl; }
};

struct X2 : X
{
  void my_func( char value ) { X:my_func(value); }
};

По умолчанию компилятор использует функции в том же классе, если он присутствует, поскольку у него нет возможности узнать, какой из них вы на самом деле хотите использовать. Указав BaseClass::Function в методе производного класса, компилятор явно создаст вызов метода этого базового класса, даже если вы переопределили.

0 голосов
/ 04 июня 2010

Проблема возникает из-за сокрытия. http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9

0 голосов
/ 04 июня 2010

Ваш вызов my_func (значение) является рекурсивным. Вы имели в виду super :: my_func (value)?

0 голосов
/ 04 июня 2010

Программа попадает в бесконечный цикл.my_func () вызывает себя, и нет условия для выхода из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...