21xrx.com
2024-11-08 20:16:35 Friday
登录
文章检索 我的文章 写文章
C++中的覆盖与隐藏
2023-07-14 08:54:35 深夜i     --     --
C++ 覆盖 隐藏 多态 虚函数

C++是一种面向对象编程语言,支持多态和继承,其中覆盖和隐藏是两种常见的继承关系。本文将针对C++中的覆盖和隐藏进行解释。

覆盖是指在一个派生类中重新实现一个基类的虚函数,这样当该函数被调用时,将会执行派生类中的实现而非基类中的实现。例如,以下代码中派生类B覆盖了基类A中的foo()函数:


class A {

public:

  virtual void foo() { // 基类中的虚函数

    cout << "A::foo() called" << endl;

  }

};

class B : public A {

public:

  virtual void foo() { // 派生类中重写的虚函数

    cout << "B::foo() called" << endl;

  }

};

int main() {

  A* p = new B(); // 派生类B的指针可以赋值给基类A的指针

  p->foo(); // 调用的是派生类B中的foo()函数

  return 0;

}

上述代码中,通过将派生类B的指针赋值给基类A的指针,我们可以调用派生类B中重写的虚函数foo()。当p->foo()被调用时,实际上会执行B::foo()函数而非A::foo()函数。

隐藏是指在派生类中重新定义一个与基类同名的非虚函数,此时基类的同名函数被隐藏,即在派生类中无法访问基类的同名函数。例如,以下代码中派生类B隐藏了基类A中的foo()函数:


class A {

public:

  void foo() { // 基类中的非虚函数

    cout << "A::foo() called" << endl;

  }

};

class B : public A {

public:

  void foo() { // 派生类中与基类同名的函数

    cout << "B::foo() called" << endl;

  }

};

int main() {

  B b;

  b.foo(); // 调用的是派生类B中的foo()函数

  b.A::foo(); // 通过作用域解析运算符访问基类A中的foo()函数

  return 0;

}

上述代码中,当派生类B中的foo()函数被调用时,实际上执行的是B::foo()函数而非A::foo()函数。如果我们需要访问基类A中的foo()函数,可以使用作用域解析运算符“::”,如b.A::foo()。

总结:

- 覆盖和隐藏都是C++中的继承关系,覆盖是指在派生类中重新实现一个基类的虚函数,隐藏是指在派生类中重新定义一个与基类同名的非虚函数。

- 覆盖会导致调用派生类中的虚函数而非基类中的虚函数,而隐藏会导致在派生类中无法访问基类的同名函数。

- 在实际编程中,需要根据具体情况选择使用覆盖或隐藏。覆盖通常用于实现多态,而隐藏则可能导致程序逻辑错误。

  
  

评论区

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