📜  C ++ |虚函数|问题7(1)

📅  最后修改于: 2023-12-03 15:13:45.367000             🧑  作者: Mango

C++ | 虚函数 | 问题7

介绍

虚函数是C++中一种重要的机制,它允许在类的继承层次中进行多态调用。本文将介绍虚函数的相关概念和使用,同时提供一个问题7的示例。通过本文的学习,读者将了解到虚函数的核心特点及其在实际编程中的应用。

虚函数概念

虚函数是在基类中通过虚函数关键字 virtual 定义的函数。这个函数可以被继承的子类重写,同时被继承的子类可以通过虚函数进行多态调用。使用虚函数,可以使得代码更加简洁、高效、易于维护。虚函数语法如下所示:

virtual 返回值类型 函数名(参数列表) {}

在子类中重写虚函数时,需要使用与基类相同的函数签名和返回类型,同时需要使用 override 关键字标记,用来表示这是一个重写基类虚函数的函数。如果子类中没有使用 override 关键字进行标记或者所使用的函数签名或返回类型与基类不同,编译器将会报错。示例如下所示:

class Base {
public:
  virtual void foo() {}
};

class Derived : public Base {
public:
  virtual void foo() override {}
};
多态调用

多态调用是利用虚函数实现的一个重要概念,它允许在一个指向基类的指针或引用上,通过虚函数调用子类中被重写的函数。这个过程称为多态性或运行时多态性。它使得程序员可以使用基类的指针或引用来访问其派生类的成员函数,从而实现类似于Java或C#的接口调用方式。示例如下所示:

Base *b = new Derived();
b->foo(); // 调用 Derived 类的 foo 函数
问题7

问题7是一道经典的面试题,考察对虚函数、多态性和继承的理解。题目如下:

#include <iostream>

class A {
public:
  virtual ~A() {}
  virtual void foo() { std::cout << "A::foo()" << std::endl; }
};

class B : public A {
public:
  ~B() {}
  void foo() { std::cout << "B::foo()" << std::endl; }
};

void bar(A *a) { a->foo(); }

int main() {
  B *b = new B();
  bar(b);
  delete b;
  return 0;
}

这段代码的输出是什么?请解释。

答案是:

B::foo()

这里的 bar 函数接收一个指向 A 类的指针,由于 B 类是 A 类的子类,因此可以将创建的 B 类对象传递给 bar 函数。此时,运行时多态性起作用,实际上调用了 B 类中的 foo 函数。由于 foo 函数是在 B 中被重写的,因此输出的是 B::foo()。

总结

本文介绍了虚函数的概念和使用,同时提供了一个问题7的示例来帮助读者深入理解多态调用。通过对虚函数的学习,程序员可以更加高效地创建继承层次结构,减少冗余代码,并通过多态性实现更加灵活的编程方式。