将指向派生类的指针作为基类的参数传递

Pass a pointer to derived class as parameter of Base class

本文关键字:基类 参数传递 指针 派生      更新时间:2023-10-16
#include <iostream>
using namespace std;
class Base1
{
  public:
  virtual int virt1() { return 100; }
  int data1;
};
class Derived : public Base1
{
  public:
  virtual int virt1() { return 150; }
  int derivedData;
};
int Global1( Base1 * b1 )
{
  return b1->virt1();
}
main()
{
  Derived * d = new Derived;
  cout << Global1(d);
}

我有这个代码片段,我的问题是,当我们将指针 d 传递给函数 Global1 时,我们传递给函数的指针的类是什么,它是派生的还是 base1?如果它是一个 base1 类,为什么它会打印 150。

你在这里展示的是虚函数的全部意义。 当您将基类中的函数声明为 virtual 时,您是在说编译器应该将绑定函数调用推迟到运行时。

如果您没有将 virt1() 声明为虚拟,编译器将查看您作为 Base1 实例传递的对象,并在该类上调用 virt1(),返回 100。

使用虚拟函数,编译器会等到运行时才能查看实际类型。 具有虚拟方法的类在对象中嵌入了一个指针,该指针指向要调用的虚拟函数表。 在运行时,您的应用程序提取正确版本的 vert1() 并调用它,因此在这种情况下它将返回 150。