简述类成员函数的重写、重载和隐藏的区别

在C++中,类成员函数的重写、重载和隐藏是面向对象编程中常用的概念,它们的含义和使用方式如下:

  1. 重写:在派生类中,如果基类的虚函数(virtual function)在派生类中有相同的函数签名(即函数名和参数类型),那么基类的虚函数被派生类的函数重写。这种情况下,通过基类的指针或引用调用该函数时,会执行派生类的函数,这是多态性的一种体现。
class Base {
public:
    virtual void func() { cout << "Base::func()" << endl; }
};

class Derived : public Base {
public:
    void func() override { cout << "Derived::func()" << endl; } // 重写基类的func()函数
};
  1. 重载:在同一个类中,如果有两个或多个函数名相同,但参数列表(包括参数数量和类型)不同,那么这些函数就构成了重载函数。函数的返回类型不能作为重载的依据。
class MyClass {
public:
    void func() { cout << "func()" << endl; } // func()函数的一个版本
    void func(int x) { cout << "func(int)" << endl; } // func()函数的另一个版本,形成重载
};
  1. 隐藏:在派生类中,如果存在与基类同名但不同参数列表的函数,那么基类中的同名函数在派生类中会被隐藏。这意味着你不能通过派生类的对象或指针来调用被隐藏的基类函数,除非显式地通过基类的名字调用。
class Base {
public:
    void func() { cout << "Base::func()" << endl; }
};

class Derived : public Base {
public:
    void func(int x) { cout << "Derived::func(int)" << endl; } // 隐藏了基类的func()函数
};

在这个例子中,如果你创建了一个Derived对象,并尝试调用func()函数(没有参数),编译器会报错,因为Derived::func(int)隐藏了Base::func()

这三种概念在实际编程中应用频繁,理解它们对于编写和理解面向对象的C++代码至关重要。

发表评论

后才能评论