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

Why derived class overloaded function hides base class function?

本文关键字:隐藏 基类 类函数 函数 重载 派生 为什么      更新时间:2023-10-16

请考虑以下代码:

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() 接受零参数。为什么会这样?如果函数签名在基类和派生类中匹配,我可以理解编译器隐藏基类版本,但是如果它们采用不同的参数/不同的 no,为什么编译器无法解析这两个函数。的参数?

你必须在派生类中创建函数体

void Fun()
{
}

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

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

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

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 Classn");
    }
};
class Derived : public Base
{
public:
    void Fun()
    {
        Base::Fun();
    }
    void Fun(int x)
    {
                printf("Derived Classn");
    }
};
int main()
{
    Derived d;
    d.Fun(5);
    d.Fun();    // No Compilation error
} 

编译错误,因为派生类中没有任何'Fun()'。您正在使用派生类对象调用Fun()。在 CPP 中,这称为 'method hiding' 。 为了解决派生类中的创建函数 Fun()

void Fun() { }