为什么这个程序挂起?

时间:2010-06-04 05:47:02

标签: c++ inheritance

我有以下代码似乎导致无限循环:

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 个答案:

答案 0 :(得分:10)

第二位是无限递归的:

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

<击>

谢谢Charles Bailey。上述代码在这种情况下不适用,因为X2的{​​{1}}隐藏了基类的my_func。这留下了使用类名限定函数的唯一解决方案。

答案 1 :(得分:2)

void my_func( char value ) { my_func(value); }

您正在传递value char,因此它解析为调用相同的方法并接受char参数。它变成了一个无限循环。

答案 2 :(得分:2)

void my_func( char value ) { my_func(value); }

就在那里,你已经编写了一个没有基本情况的递归函数。我不太了解C ++,但是你需要以某种方式指定你想要调用X的my_func,而不是X2(我假设你想要这样做。)

编辑要修复它,您需要将值转换为int

答案 3 :(得分:0)

程序进入无限循环。 my_func()调用自身,没有条件退出它。

答案 4 :(得分:0)

您的调用my_func(value)是递归的。你的意思是super :: my_func(value)?

答案 5 :(得分:0)

答案 6 :(得分:0)

您需要显式调用基类'函数,即:

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,编译器将显式创建对该基类的方法的调用,即使您已被覆盖。