#include<iostream> #include<typeinfo> using namespace std; class base { public: virtual void virtual_fun() {cout<<"base"<<endl;} void normal_fun() {cout<<"base"<<endl;} }; class derived { public: virtual void virtual_fun() {cout<<"derived"<<endl;} void normal_fun() {cout<<"derived"<<endl;} }; int main() { base *cp=(base *)new derived; cp->virtual_fun(); cp->normal_fun(); derived *dp=(derived *)new base; dp->virtual_fun(); dp->normal_fun(); }
程序运行结果:
derived
base
base
derived
由此可得:
(1) 基类指针=(基类指针类型)new 派生类;
该指针调用虚函数时,调用派生类的虚函数。(多态)
调用非虚函数,调用的是基类的函数。
(2) 派生类指针=(派生类指针类型)new 基类;
调用虚函数时,调用基类的虚函数。
调用非虚函数,调用的是派生的函数。
总结:
在继承层次中,存在向上指针类型转换或者向下类型转换,则调用成员函数(两个类都实现了)调用的是哪个类的函数,遵循下面2个规则:
(1)调用虚函数时,因为是动态绑定,所以根据指针指向的对象的实际类型来决定。
(2)调用非虚函数,静态决定,所以根据表面山看到的类的类型来决定。