我有一个基类,其中有2个重载的expand()函数 我在派生类中重载了其中一个,并试图在其中调用另一个。
class Base
{
public:
bool expanded()
{
return false;
}
void expanded(bool isit)
{
}
};
class Derived : public Base
{
public:
void expanded(bool isit)
{
expanded();
}
};
此操作失败,并出现编译错误:'Derived :: expanded':函数未使用0个参数
答案 0 :(得分:0)
新方法,即子类中的方法隐藏了旧方法的范围。要调用它,您需要在范围上明确:
class Derived : public Base
{
public:
void expanded(bool isit)
{
Base::expanded();
}
};
,如果您想维护相同的接口,则需要在派生类中重新定义。
class Derived : public Base
{
public:
void expanded(bool isit)
{
Base::expanded();
}
bool expanded()
{
return Base::expanded();
}
};
答案 1 :(得分:0)
以下将起作用:
解决方案1:
class Derived : public Base
{
public:
void someOtherMethod(bool isit)
{
expanded();
}
};
解决方案2:
class Derived : public Base
{
public:
void expanded(bool isit)
{
// Will call child's expanded(bool) and will become recursive.
expanded(false);
}
};
解决方案3:
class Derived : public Base
{
public:
void expanded(bool isit)
{
Base::expanded();
}
};
在子类中定义与父方法相同的方法时,无论何时在子类中遇到该方法名称,编译器都只会在子类中搜索定义。这就是这里发生的事情。当子类的扩展接受1个参数时,编译器期望传递一个参数。
答案 2 :(得分:0)
类似的问题已经在Overloads of inherited member functions中回答
添加到上一个答案。范围之间没有重载-派生类范围也不是该一般规则的例外。您可以通过这样声明Baseclass来轻松解决错误
class Derived : public Base
{
public:
using Base::expanded;
void expanded(int isit)
{
expanded();
}
};