父类子类指针相互转换问题
父类子类指针相互转换问题
1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的:
2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;
3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的;
将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;
当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。
详见以下代码:
1 #include <iostream> 2 using namespace std; 3 class Base { 4 public: 5 virtual void f() { cout << "Base::f" << endl; } 6 virtual void g() { cout << "Base::g" << endl; } 7 void h() { cout << "Base::h" << endl; } 8 9 }; 10 class Derived:public Base 11 { 12 public: 13 virtual void f(){cout<<"Derived::f"<<endl;} 14 void g(){cout<<"Derived::g"<<endl;} 15 void h(){cout<<"Derived::h"<<endl;} 16 }; 17 18 19 void main() 20 { 21 Base *pB=new Base(); 22 cout<<"当基类指针指向基类对象时:"<<endl; 23 pB->f(); 24 pB->g(); 25 pB->h(); 26 cout<<endl; 27 28 Derived *pD=(Derived*)pB; 29 cout<<"当父类指针被强制转换成子类指针时:"<<endl; 30 pD->f(); 31 pD->g(); 32 pD->h(); 33 cout<<endl; 34 35 Derived *pd=new Derived(); 36 cout<<"当子类指针指向子类时候"<<endl; 37 pd->f(); 38 pd->g(); 39 pd->h(); 40 cout<<endl; 41 42 Base *pb=(Base *)pd; 43 cout<<"当子类指针被强制转换成父类指针时:"<<endl; 44 pb->f(); 45 pb->g(); 46 pb->h(); 47 cout<<endl; 48 49 Base *pp=new Derived(); 50 cout<<"父类指针指向子类对象时候:"<<endl; 51 pp->f(); 52 pp->g(); 53 pp->h(); 54 cout<<endl; 55 }
执行结果如下图: