为什么派生类重载函数隐藏基类函数?

时间:2014-04-02 05:44:03

标签: c++ inheritance

请考虑以下代码:

class Base
{
public:

    void Fun()
    {
    }
};

class Derived : public Base
{
public:

    void Fun(int x)
    {
    }
};

int main()
{
    Derived d;
    d.Fun(5);
    d.Fun();    // Compilation error
}

在编译时,编译器抱怨没有Fun()版本接受零参数。为什么会这样?如果函数签名在Base和派生类中匹配,我可以理解编译器隐藏基类版本,但是如果编译器采用不同的参数/不同的值,为什么编译器无法解析这两个函数。参数?

3 个答案:

答案 0 :(得分:0)

你必须在派生类

中创建函数体
void Fun()
{
}

首先编译时间,它将检查派生类中的函数体。

答案 1 :(得分:0)

编译错误,因为派生类中没有任何“Fun()”。您使用派生类对象调用Fun()。在CPP中,这被称为'method hiding'。要解决此问题,请在派生类

中创建函数Fun()
  

void Fun() { }

答案 2 :(得分:0)

如果没有在派生类中重载函数,可以使用基类函数。

在下面的示例中,我更改了派生类的函数名称...

class Base
{
public:

    void Fun()
    {
    }
};

class Derived : public Base
{
public:

    void Fun1(int x)
    {
    }
};

int main()
{
    Derived d;
    d.Fun1(5);
    d.Fun();    // No Compilation error
}

如果要在派生类中重载函数,则必须覆盖基类函数。像这样

class Base
{
public:

    void Fun()
    {
                printf("Base Class\n");
    }
};
class Derived : public Base
{
public:

    void Fun()
    {
        Base::Fun();
    }
    void Fun(int x)
    {
                printf("Derived Class\n");
    }
};

int main()
{
    Derived d;
    d.Fun(5);
    d.Fun();    // No Compilation error
}