我有以下代码似乎导致无限循环:
struct X
{
void my_func( int ) { std::cout << "Converted to int" << std::endl; }
};
struct X2 : X
{
void my_func( char value ) { my_func(value); }
};
它有什么问题?
答案 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
,编译器将显式创建对该基类的方法的调用,即使您已被覆盖。