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

时间:2014-11-18 19:38:26

标签: c++

#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。

1 个答案:

答案 0 :(得分:3)

您在这里展示的是虚拟功能的重点。当您将基类中的函数声明为虚拟时,您就是说编译器应该将函数调用延迟绑定到运行时。

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

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