天天看點

C++基類與派生類的函數調用情況



在定義了基類的指針與派生類的對象,或者是派生類指針與基類的對象。

在函數調用的時候,如果該函數在基類中被定義為虛函數,那麼在調用的時候看該指針(包括基類指針和派生類指針)所指向的對象,如果是派生類的對象就調用派生類中重寫的函數,如果是基類的對象就調用基類中的函數。如果該函數為非虛函數,那麼看該指針的類型,如果是基類的指針就調用基類中的函數,如果是派生類的指針就調用派生類中的函數。這種情況是非多态的情況,函數沒有實作重寫,而隻是進行了覆寫。

#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;
}
           
C++基類與派生類的函數調用情況

繼續閱讀