【发布时间】:2023-04-03 22:10:02
【问题描述】:
假设没有Hello函数,我们只是在main中调用ob.display,然后它调用B类而不是A类的显示函数。
函数 display() 的调用被编译器设置为基类中定义的版本。这称为函数调用的静态解析或静态链接 - 函数调用在程序执行之前就已固定。这有时也称为早期绑定,因为 display() 函数是在程序编译期间设置的。
现在如何在基类的显示函数前不使用virtual关键字(后期绑定)来调用派生类的显示函数呢?
现在在这个程序中,通过值调用、指针调用和对 Hello 函数的引用调用传递对象都可以正常工作。现在,如果我们使用多态,并且想要显示派生类的成员函数,如果它被调用,我们必须在基类的显示函数之前添加 virtual 关键字。如果我们通过指针调用和引用调用传递对象值,它会调用派生类中的函数,但如果我们通过值传递对象,为什么会这样?>
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;
}
【问题讨论】:
标签: c++ binding polymorphism