在定義了基類的指針與派生類的對象,或者是派生類指針與基類的對象。
在函數調用的時候,如果該函數在基類中被定義為虛函數,那麼在調用的時候看該指針(包括基類指針和派生類指針)所指向的對象,如果是派生類的對象就調用派生類中重寫的函數,如果是基類的對象就調用基類中的函數。如果該函數為非虛函數,那麼看該指針的類型,如果是基類的指針就調用基類中的函數,如果是派生類的指針就調用派生類中的函數。這種情況是非多态的情況,函數沒有實作重寫,而隻是進行了覆寫。
#include "iostream"
using namespace std;
#include<iostream>
using namespace std;
class Base
{
public:
virtual void f(float x)
{
cout<<"Base::f(float)"<< x <<endl;
}
void g(float x)
{
cout<<"Base::g(float)"<< x <<endl;
}
};
class Derived : public Base
{
public:
virtual void f(float x)
{
cout<<"Derived::f(float)"<< x <<endl; //多态、覆寫
}
void g(int x)
{
cout<<"Derived::g(int)"<< x <<endl; //隐藏
}
};
int main(void)
{
//定義子類的對象
Derived d;
// 基類的指針指向子類對象
Base *pb = &d;
//子類指針指向子類對象
Derived *pd = &d;
//虛函數,是調用所指向對象的函數
pb->f(3.14f); // Derived::f(float) 3.14
pd->f(3.14f); // Derived::f(float) 3.14
// 非虛函數,根據指針屬于基類或子類調用
pb->g(3.14f); // Base::g(float) 3.14
pd->g(3.14f); // Derived::g(int) 3
Base a;//定義基類的對象
Derived *ptr = (Derived *)&a;//子類的指針
ptr->f(3.14f); // Base::f(float) 3.14
ptr->g(3.14f); // Derived::g(int) 3
return 0;
}