基类和派生类中定义了同名的(非虚)函数,指针会调用哪一个的有关问题

基类和派生类中定义了同名的(非虚)函数,指针会调用哪一个的问题
#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中这个函数的信息还是怎样?迷糊~~
------解决思路----------------------
如果基类和派生类都定义了相同名称的成员函数(非虚),那么通过对象指针调用成员函数时,到底调用哪一个,必须视该指针的原始类型而定,而不是视指针实际所指向的对象的类型而定”。
--------------------------------------------
怎么这么复杂的解释?

只要记住:对于非虚的成员函数,就与动态绑定(多态)没关系,全部都是静态绑定!

另,自己写的类,最好不要override(改写)继承而来的非虚函数。
------解决思路----------------------
没有特别原因,只是C++语言的规范而已,如果人们定义了另一套规范就是另一种规则了。

比较下面2种规则:
1、使用关键字virtual定义虚函数,调用虚函数时调用实际对象的函数
2、没有虚函数的的概念,增加一个“=>”操作符,当使用pointer=>function()时调用实际对象的函数

以上2种规则都可以满足开发的需要,但很显然第2种会让编译器变得复杂而且程序员更容易犯错误。