21xrx.com
2025-04-05 02:38:48 Saturday
文章检索 我的文章 写文章
C++中的重写和隐藏问题
2023-07-04 04:41:33 深夜i     17     0
C++ 重写 隐藏问题

在C++中,当一个派生类继承了一个基类,如果该派生类中定义了与基类中同名的成员函数,这就会出现重写和隐藏问题。

重写是指派生类中定义了与基类中同名的成员函数,此时基类中的成员函数会被派生类中的成员函数所覆盖,派生类中的函数被调用。如果需要在派生类中调用基类中的函数,可以使用作用域解析运算符“::”来调用基类中的那个函数。

隐藏是指派生类中定义了一个与基类中同名但参数列表不同的成员函数,这个成员函数会隐藏基类中的成员函数。当使用派生类对象调用同名函数时,会调用派生类中的函数,而不是基类中的函数。如果使用基类指针或引用来调用同名函数,则会调用基类中的函数。

以下是一个代码示例:

#include <iostream>
using namespace std;
class Base {
public:
  virtual void foo(int x) {
    cout << "Base::foo(int)" << endl;
  }
  void bar() {
    cout << "Base::bar()" << endl;
  }
};
class Derived : public Base {
public:
  void foo(double x) {
    cout << "Derived::foo(double)" << endl;
  }
};
int main() {
  Derived d;
  d.foo(1); // Derived::foo(double)
  d.bar(); // Base::bar()
  Base* b = &d;
  b->foo(1); // Base::foo(int)
  b->foo(1.0); // Derived::foo(double)
}

在上面的代码中,派生类Derived中定义了与基类Base中同名但参数不同的函数foo(double x),这就会导致基类中的成员函数foo(int x)被隐藏。在派生类对象d中调用foo(1)时,编译器会自动将1转换为double类型,因此输出的结果是Derived::foo(double)。而在调用bar()时,因为派生类中未定义该函数,因此会调用基类中的函数,输出的结果是Base::bar()。

而在使用基类指针b来调用同名函数时,调用b->foo(1)时,由于基类中定义了foo(int x),因此输出的结果是Base::foo(int)。而调用b->foo(1.0)时,由于派生类中定义了foo(double x),因此输出的结果是Derived::foo(double)。

因此,在C++中,重写和隐藏是需要特别注意的问题。需要根据具体情况来选择如何使用派生类中的成员函数,避免出现错误或意外的结果。

  
  

评论区