21xrx.com
2024-09-19 09:37:04 Thursday
登录
文章检索 我的文章 写文章
C++中隐藏与覆盖的区别和用法
2023-07-02 20:03:28 深夜i     --     --
C++ 隐藏 覆盖 区别 用法

C++中隐藏(Hidden)与覆盖(Override)都是面向对象编程中常见的概念,用于描述派生类继承基类时的成员函数的关系。虽然两者看起来类似,但实际上有着不同的含义和用法。

隐藏(Hidden)是指当派生类的成员函数与基类的成员函数同名时,派生类的函数会“隐藏”基类的同名函数,也就是说,基类的函数将无法被访问到。这种情况下,如果在派生类中想要调用基类的函数,可以使用作用域限定符“::”来指定基类的作用域,例如“基类名::函数名”。

举个例子,假设有一个基类Animal和一个派生类Cat,它们都有一个名为“eat”的成员函数。此时,如果在Cat类中定义一个与Animal类中的“eat”函数同名的函数,那么在调用Cat类中的eat时将只会调用Cat类中的函数,Animal类中的函数会被隐藏起来。代码如下:


class Animal{

public:

  void eat()

    cout << "Animal is eating" << endl;

  

};

class Cat : public Animal{

public:

  void eat()

    cout << "Cat is eating" << endl;

  

};

int main(){

  Cat c;

  c.eat();  // 输出“Cat is eating”

  // 如果想要调用基类中的函数,可以使用作用域限定符“::”

  c.Animal::eat(); // 输出“Animal is eating”

}

覆盖(Override)则是指派生类重写基类的虚函数,从而影响到使用基类指针或引用调用虚函数时的行为。也就是说,当派生类的虚函数与基类的虚函数同名且参数列表完全一致时,派生类的虚函数会覆盖基类的虚函数。在这种情况下,使用基类指针或引用调用虚函数时,将会调用派生类中的函数。

举个例子,仍以Animal和Cat为例。此时,如果在Animal类中将eat函数定义为虚函数,那么在派生类中重写eat函数时需要使用“virtual”关键字,并且参数列表必须与基类中的完全一致。代码如下:


class Animal{

public:

  virtual void eat()

    cout << "Animal is eating" << endl;

  

};

class Cat : public Animal{

public:

  virtual void eat()

    cout << "Cat is eating" << endl;

  

};

int main(){

  Animal *p;

  Cat c;

  p = &c;

  p->eat();  // 输出“Cat is eating”

}

综上所述,C++中隐藏与覆盖虽然都涉及到派生类和基类之间成员函数的关系,但它们的用法和效果却有着明显的不同。在编写程序时,要根据实际情况合理选择哪种方式,以实现所需的功能。

  
  

评论区

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