关于函数调用的问题~~诚心求教!
#include <iostream.h>
class Student
{
public:
void display(){
cout < < "Student 's display " < <endl;
}
};
class Teacher:public Student
{
public:
void display(){
cout < < "Teacher 's display " < <endl;
}
};
void main()
{
Student *aa;
Teacher ta;
Student Stu;
aa=&Stu;
aa-> display();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
运行结果:
Student 's display
Press any key to continue
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
其中的语句:
aa-> display();
到底
调用的是Student类中的display()函数
还是Teacher类中从Student类继承过来的 display()函数呢?
诚心求教!
[解决办法]
非virtual函数没有多态性,结果完全取决于指针的静态类型。
aa既然是Student型的指针,那么执行的就总是Student类的display,因为display不是virtual的。
[解决办法]
调用student类的display
在基类中定义了一个非虚拟函数,然后在派生类中又定义了一个同名同参数同返回类型的函数,这就是覆盖了。在派生类对象上直接调用这个函数名,只会调用派生类中的那个。
[解决办法]
aa是指向Student类的指针,调用的是Student的display
Teacher中的display覆盖了Student的display
[解决办法]
aa-> display();
aa是父类的指针,aa指向的是父类对象.
所以不管从静态绑定还是动态绑定来看犊会调用父类的函数.
实际情况是display不是虚拟函数,所以为静态绑定,编译的时候已经确定了调用的是父类的函数.