假设没有Hello函数,我们只在主函数中调用ob.display,那么它将调用类B的display函数而不是类A的。编译器会将display()函数的调用设置为基类中定义的版本,这被称为函数调用的静态分辨率或静态链接-函数调用在程序执行之前被固定。有时也称为早期绑定,因为display()函数在程序编译期间设置。那么在不使用虚拟关键字(后期绑定)之前如何调用派生类的display函数呢?
现在,在这个程序中,将对象作为值传递、指针传递和引用传递给Hello函数都可以正常工作。现在,如果我们使用多态性并希望在调用时显示派生类的成员函数,我们必须在基类的display函数之前添加虚拟关键字。如果我们通过指针和引用进行值的传递,则调用派生类中的函数,但如果我们通过值进行对象传递,则不会,为什么?
现在,在这个程序中,将对象作为值传递、指针传递和引用传递给Hello函数都可以正常工作。现在,如果我们使用多态性并希望在调用时显示派生类的成员函数,我们必须在基类的display函数之前添加虚拟关键字。如果我们通过指针和引用进行值的传递,则调用派生类中的函数,但如果我们通过值进行对象传递,则不会,为什么?
class A
{
public:
void display(); // virtual void display()
{
cout << "Hey from A" <<endl;
}
};
class B : public A
{
public:
void display()
{
cout << "Hey from B" <<endl;
}
};
void Hello(A ob) // &ob //*ob
{
ob.display(); // ob->display()
}
int main()
{
B obj;
Hello(obj); // obj //&ob
return 0;
}