21xrx.com
2024-12-22 20:30:01 Sunday
登录
文章检索 我的文章 写文章
C++中重写和覆盖的区别
2023-07-12 14:06:06 深夜i     --     --
C++ 重写 覆盖 区别

C++是一种面向对象的编程语言,重写与覆盖是面向对象编程中经常用到的两个概念。虽然这两个词听起来很相似,但它们实际上有着不同的含义与使用场景。

重写(Override)是指在子类中重新实现父类的虚函数(Virtual Function),并利用相同的函数签名(函数名、参数列表和返回值类型)将其替代父类中的实现。子类的实现将完全替代父类中相应的虚函数,无论在何处调用该函数,都将优先调用子类中的实现。

覆盖(Hide)是指子类中存在了一个与父类中同名的非虚函数,该函数在子类中的实现将会“遮盖”掉父类中同名的函数,无法通过基类的指针或引用来调用该函数。但是在子类对象中可以调用该函数。

下面我们通过一段代码来演示重写和覆盖的区别:


class BaseClass{

public:

  virtual void Print()

    cout<<"BaseClass Print"<<endl;

  

  void Show()

    cout<<"BaseClass Show"<<endl;

  

};

class DerivedClass: public BaseClass{

public:

  virtual void Print() override

    cout<<"DerivedClass Print"<<endl;

  

  void Show()

    cout<<"DerivedClass Show"<<endl;

  

};

int main(){

  BaseClass* base = new DerivedClass();

  base->Print(); // DerivedClass Print

  base->Show(); // BaseClass Show

  DerivedClass* derived = new DerivedClass();

  derived->Print(); // DerivedClass Print

  derived->Show(); // DerivedClass Show

  return 0;

}

代码中,我们定义了一个基类 BaseClass 和一个派生类 DerivedClass。在 BaseClass 中,我们定义了一个虚函数 Print 和一个普通函数 Show。在 DerivedClass 中,我们从 BaseClass 继承并覆盖了 Print 函数,同时我们也定义了与基类中同名的非虚函数 Show。最后,我们分别创建了一个 BaseClass 类型的指针和一个 DerivedClass 类型的指针。

在 main 函数中,我们首先通过 BaseClass 指针调用 Print 和 Show 函数,具体调用的是派生类中的哪个函数?实际上,由于 Print 函数是虚函数,在派生类中重写了该函数,因此在 BaseClass 指针指向的对象中,会调用派生类中的 Print 函数。而 Show 函数则不是虚函数,所以在调用时会根据指针类型的不同调用不同的函数,所以这里会调用基类中的 Show 函数。

接着,我们通过 DerivedClass 指针直接调用 Print 和 Show 函数,不难看出,这里会分别调用派生类中的 Print 和 Show 函数。

综上所述,重写是用于实现多态性的关键机制之一,让程序可以在运行时动态地选择调用哪个函数。而覆盖则更多地用于在派生类中隐藏或修改基类中的实现。无论是重写还是覆盖,都是面向对象编程中的重要知识点,合理地运用可以使程序更加灵活,具有更好的可维护性和扩展性。

  
  

评论区

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