一 实验目的和要求
了解静态联编的动态联编的概念。二 实验内容
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)找出以上程序中使用了重载和覆盖函数。
答:Base类中函数void g(); 和void h();与Derived类中的函数void g(); 和void h();函数名相同,参数类型不同,构成了函数重载。
(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)找出以上程序中使用了重载和覆盖函数。
答:Base类中函数void f(); 在同一作用域中,函数名相同,参数类型不同,构成了函数重载。
(2)写出程序的输出结果,并解释输出结果。
程序的输出结果如下:
输出结果分析:pb和pd指向同一地址,它们运行结果应该是相同的,但实际运行出来的结果却不相同,原因是决定pb和pd调用函数运行结果的不是他们指向的地址,而是他们的指针类型。“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用”。在程序中pb是基类指针,pd是派生类指针,pd的所有函数调用都只是调用自己的函数,和多态性无关,所以pd的所有函数调用的结果都输出Derived::是完全正常的;pb的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的,所以有virtual的f函数调用输出Derived::,其它两个没有virtual则还是输出Base::。