kanyixiaC++ 虚函数

1.分析、调试下列程序

#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;}
		void h(float x){cout<<"Base::h(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;}
		void h(float x){cout<<"Derived::h(float)"<<x<<endl;}
};
int main()
{
	Derived d;
	Base *pb=&d;
	Derived *pd=&d;
	pb->f(3.14f);
	pd->f(3.14f);
	pb->g(3.14f);
	pb->h(3.14f); 
	pd->h(3.14f); 
	return 0;
}

(1) 找出以上程序中使用了重载、覆盖的函数

(2) 写出程序的输出结果,并解释输出结果。

 

2.分析、调试下列程序

#include <iostream>
using namespace std;
class Base
{
	public:
		void f(int x){cout<<"Base::f(int)"<<x<<endl;}
		void f(float x){cout<<"Base::f(float)"<<x<<endl;}
		virtual void g(void){cout<<"Base::g(void)"<<endl;}
};
class Derived:public Base
{
	public:
		virtual void g(void){cout<<"Derived::g(void)"<<endl;}
};
int main()
{
	Derived d;
	Base *pb=&d;
	pb->f(42); 
	pb->f(3.14f);
	pb->g(); 
	return 0;
}

(1) 找出以上程序中使用了重载、覆盖的函数

(2) 写出程序的输出结果,并解释输出结果。

 

 

第1题:

(1)void g(int x)函数是重载函数

virtual void f(float x)函数和void h(float x)函数是覆盖的函数(重写)

(2)输入及解释如下:

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     //父类指针,且父类中有类型匹配的函数,使用父类中的函数
pb->h(3.14f);  //Base::h(float)3.14  //父类指针,且父类中有这个函数,且不是虚函数,使用父类中的函数
pd->h(3.14f);  //Derived::h(float)   //子类指针,使用子类函数

第2题:

(1)f函数是重载,void g(void)函数是覆盖(重写)

(2)输出及解释如下:

pb->f(42);     //Base::f(int)42  //子类继承父类的函数,子类中没有重写,使用父类中参数是int型的函数
pb->f(3.14f);  //Base::f(float)3.14  //子类继承父类的函数,子类中没有重写,使用父类中参数是float型的函数
pb->g();       //Derived::g(void)    //g是虚函数,实例是子类实例,且子类有改函数的实现,使用子类中的函数