21xrx.com
2025-07-15 09:46:13 Tuesday
文章检索 我的文章 写文章
如何在C++中派生类中覆盖继承来的成员函数?
2023-06-29 21:21:07 深夜i     21     0
C++ 派生类 继承 成员函数 覆盖

在C++中,派生类可以继承基类的成员函数。但有时候我们需要在派生类中对继承来的成员函数进行覆盖,以实现派生类特定的功能。本篇文章将介绍在C++中如何派生类中覆盖继承来的成员函数。

在C++中,派生类可以通过以下方式覆盖基类的成员函数:

1.直接修改基类函数:派生类可以直接修改基类函数来实现自己的功能,但这样会对基类造成影响,不建议使用。

2.使用virtual关键字:在基类中声明为虚函数的函数,在派生类中也声明为虚函数,并进行覆盖。

3.使用override关键字:在派生类中使用override关键字来覆盖基类的成员函数。

下面以一个例子来说明以上三种覆盖基类成员函数的方法:

c++
#include <iostream>
using namespace std;
class Base {
public:
  virtual void func() {
    cout << "Base::func()" << endl;
  }
};
class Derived : public Base {
public:
  // 直接修改基类函数
  void func() {
    cout << "Derived::func()" << endl;
  }
  // 使用virtual关键字进行覆盖
  virtual void func2() override {
    cout << "Derived::func2()" << endl;
  }
  // 使用override关键字进行覆盖
  void func3() override {
    cout << "Derived::func3()" << endl;
  }
};
int main() {
  Base *ptr = new Derived;
  ptr->func(); // 输出Derived::func()
  ((Derived *)ptr)->func(); // 输出Derived::func()
  // ptr->func2(); // 编译错误,因为Base类中没有func2()函数
  ((Derived *)ptr)->func2(); // 输出Derived::func2()
  // ptr->func3(); // 编译错误,派生类中的func3()函数不是虚函数,不能使用动态绑定
  ((Derived *)ptr)->func3(); // 输出Derived::func3()
  delete ptr;
  ptr = nullptr;
  return 0;
}

在上述例子中,Base类中声明了一个虚函数func(),并在Derived类中对其覆盖,直接修改了函数实现。此外,Derived类还声明了两个新的成员函数:func2()和func3()。

使用func()函数的指针访问时,由于func()在Base类中是虚函数,在Derived类中也声明为虚函数并进行覆盖,因此动态绑定会自动调用Derived类中的func()实现。

使用func2()函数的指针访问时,不能直接使用Base类的指针,因为同名函数在Base类中不存在。需要将Base类的指针转换为Derived类的指针,才能正确访问。

使用func3()函数的指针访问时,由于func3()在Derived类中声明为override关键字,因此动态绑定会自动调用Derived类中的实现。但如果使用Base类的指针,会发生编译错误,因为func3()不是虚函数,不能使用动态绑定。

综上,对于继承来的成员函数覆盖,最好使用override关键字,在覆盖时避免对基类造成影响,同时可以充分发挥C++的动态绑定机制。

  
  
下一篇: C++基本单元

评论区