1.當自己的類指針指向自己類的對象時,無論調用的是虛函數還是實函數,其調用的都是自己的:
2.當指向父類對象的父類指針被強制轉換成子類指針時候,子類指針調用函數時,只有非重寫函數是自己的,虛函數是父類的;
3.當指向子類對象的子類指針被強制轉換成父類指針的時候,也就是父類指針指向子類對象,此時,父類指針調用的虛函數都是子類的,而非虛函數都是自己的;
總結:當父類子類有同名非虛函數的時候,調用的是轉換後的指針類型的函數;
當父類子類有同名虛函數的時候呢,調用的是指針轉換前指向的對象類型的函數。
#include <iostream>
using namespace std;
class Base {
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
void h() { cout << "Base::h" << endl; }
};
class Derived:public Base
{
public:
virtual void f(){cout<<"Derived::f"<<endl;}
void g(){cout<<"Derived::g"<<endl;}
void h(){cout<<"Derived::h"<<endl;}
};
int main()
{
Base *pB=new Base();
cout<<"當基類指針指向基類對象時:"<<endl;
pB->f();//Base::f
pB->g();//Base::g
pB->h();//Base::h
Derived *pD=(Derived*)pB;
cout<<"當父類指針被強制轉換成子類指針時:"<<endl;
pD->f();//Base::f
pD->g();//Base::g
pD->h();//Derived::h
Derived *pd=new Derived();
cout<<"當子類指針指向子類時候"<<endl;
pd->f();//Derived::f
pd->g();//Derived::g
pd->h();//Derived::h
Base *pb=(Base *)pd;
cout<<"當子類指針被強制轉換成父類指針時:"<<endl;
pb->f();//Derived::f
pb->g();//Derived::g
pb->h();//Base::h
Base *pp=new Derived();
cout<<"父類指針指向子類對象時候:"<<endl;
pp->f();//Derived::f
pp->g();//Derived::g
pp->h();//Base::h
}