21xrx.com
2024-11-25 01:14:04 Monday
登录
文章检索 我的文章 写文章
如何在C++中派生类中覆盖继承来的成员函数?
2023-06-29 21:21:07 深夜i     --     --
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++基本单元

评论区

{{item['qq_nickname']}}
()
回复
回复