为什么我们不能从派生类调用重载函数

时间:2019-09-10 05:03:29

标签: c++

我有一个基类,其中有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个参数

3 个答案:

答案 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();
    }
};