基类和派生类中定义了同名的(非虚)函数,指针会调用哪一个的问题
#include "iostream.h"
class A
{
public:
void fun(){ cout<<"This is A::fun()"<<endl;}
};
class B :public A
{
public:
void fun(){ cout<<"This is B::fun()"<<endl;}
};
void main(void)
{
A* pa;
B* pb= new B;
pa=pb;
pa->fun();
}
上段程序很简单。
书中说:“如果基类和派生类都定义了相同名称的成员函数(非虚),那么通过对象指针调用成员函数时,到底调用哪一个,必须视该指针的原始类型而定,而不是视指针实际所指向的对象的类型而定”。
如上程序中,虽然pa指向了B对象的一段内存,但是调用fun()函数时,调用的是A的函数(A::fun())。
反之:(类定义不变)
void main(void)
{
A* pa= new B;
B* pb;
pb=(B*)pa;
pb->fun();
}
输出是:B::fun()
这是为什么呢?(对于函数定义为虚函数时的情况我是了解的)类中的函数只是一段代码,那么,既然pa指向一段类B对象的区域,它又采取什么样的方式知道,自己需要调用A中定义的函数并执行其代码呢?
或者,在声明A* pa;时,pa中已经有了A中这个函数的信息还是怎样?迷糊~~