#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。
答案 0 :(得分:3)
您在这里展示的是虚拟功能的重点。当您将基类中的函数声明为虚拟时,您就是说编译器应该将函数调用延迟绑定到运行时。
如果你没有将virt1()声明为虚拟,编译器会查看你作为Base1实例传递的对象,并在该类上调用virt1(),返回100。
使用虚函数,编译器会等到运行时查看实际类型。具有虚方法的类具有嵌入在对象中的指针,该指针指向要调用的虚函数表。在运行时,您的应用程序会提取正确版本的vert1()并调用它,因此在这种情况下它将返回150.