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是虚函数,实例是子类实例,且子类有改函数的实现,使用子类中的函数