现在的位置: 首页 > 编程语言 > 正文

程序实践系列(九)多态性和虚函数

2019年03月20日 编程语言 ⁄ 共 2517字 ⁄ 字号 评论关闭
文章目录

理论练习题 

  • 给出以下程序的执行结果。
#include <iostream> 
class A 
{ 
 public:
   virtual void f()  //虚函数     {        
     cout << "A::f() called." << endl;     
   } 
}; 

class B:public A 
{ 
 public:     
   virtual void f()  //虚函数     { 
      cout << "B::f() called." << endl;     
   } 
}; 

void main(){
  B b;     
  void (A::*pf)()=A::f;      
  (b.*pf)(); 
}


B::f() called.
  • 给出以下程序的执行结果
#include <iostream.h> 
class A 
{
  public:     
   virtual void disp() //虚函数     {        
      cout << "Base class A." << endl;     
   } 
}; 

class B:public A 
{ 
  public:     
   virtual void disp() //虚函数     {         
      cout << "Derived class B." << endl;     
   } 
}; 

class C:public A 
{ 
  public:     
   virtual void disp() //虚函数     {        
     cout << "Derived class C." << endl;     
   } 
}; 

void main(){
   A *ptr;
     
   A a;     
   B b;     
   C c;  
   
   ptr=&a;     
   ptr->disp(); 
    
   ptr=&b;     
   ptr->disp(); 
    
   ptr=&c; 
}


 Base class A. 
 Derived class B. 
 Derived class C. 


  • 分析以下程序的错误并改正
#include <iostream.h> 
class A 
{ 
 int x; 
public: 
 A(int i) { x=i; } 
 void dispa() { cout << "x=" << x << endl; } 
}; 
class B : public A 
{ 
 int y; 
public: 
 B(int i,int j):A(i) { y=j; } 
 void dispb() { cout << "y=" << y << endl; } 
}; 
void main() 
{ 
 A *p,a(1); 
 B b(2,3); 
 p=&a; 
 p->dispa(); 
 p=&b; 
 p->dispb(); 
}

 :程序中说明了类A和派生类B,在main()中定义了类A对象指针p,先让p指向类A的对象a,执行p->dispa(),再让p指向类B的对象b,执行p->dispb()。由于这里采用的是静态联编方式,通过指针p只能调用类A的成员函数,而类A中没有dispb()成员函数,所以出错,编译时的错误信息如下: 

error C2039: 'dispb' : is not a member of 'A' 

改正的方法是将相关的成员函数改为虚函数,程序如下:

#include <iostream.h> 
class A 
{ 
 int x; 
public: 
 A(int i) { x=i; } 
 virtual void disp()  //虚函数 
{ 
  cout << "x=" << x << endl; 
} 
}; 
class B : public A 
{ 
 int y; 
public: 
 B(int i,int j):A(i) { y=j; } 
 void disp() { cout << "y=" << y << endl; } 
}; 
void main() 
{ 
 A *p,a(1); 
 B b(2,3); 
 p=&a; 
 p->disp(); 
 p=&b; 
 p->disp(); 
}

程序执行结果如下:

x=1 
y=3 

上机实习题

题目

设计一个评选优秀教师和学生的程序,其类结构如下图所示。当输入一系列教师或学生的记录后,将优秀学生及教师的姓名列出来,并采用相关数据进行测试。

解析:设计一个基类base,含纯虚函数isgood(),由base类派生出类student和类teacher,分别包含纯虚函数针对学生和教师为优秀的定义。对应的程序如下:

参考代码

#include <iostream> 
#include <stdio.h> 

using namespace std;
 
 enum boolean {False,True}; 
 class base 
 { 
 protected: 
  char name[8]; 
 public: 
  void getname() 
  { 
   cout << "  姓名:";  
   cin >> name;  
  } 
  
  void printname()
  {    
  	cout << "  姓名:" << name << endl;   
  }  
  virtual boolean isgood()=0;  //纯虚函数 
}; 

class student : public base 
{  
	int num; 
 public:  
 	void getnum()  {   
	 	cout << "  考试成绩:";cin >> num;  
	}  
	boolean isgood() { 
		return (num>90) ? True:False; 
	} 
}; 

class teacher:public base 
{  
	int num;
  public:  
    void getnum()  {   
		cout << "  每年发表论文数:";cin >> num;  
	}  
	boolean isgood() { 
		return (num>3) ? True:False; 
	} 
}; 

int main() 
{  
	base *p[50];  
	student *pstud;  
	teacher *ptech;  
	
	char ch;  
	int count=0;  
	
	do  {   
		cout << "输入教师(t)或学生(s):";   
		cin>> ch;   
		if (ch=='s')   {    
			pstud=new student;    
			pstud->getname();    
			pstud->getnum();    
			p[count++]=pstud;   
		}   
		else if (ch=='t')   {    
			ptech=new teacher;    
			ptech->getname();    
			ptech->getnum();    
			p[count++]=ptech;   
		}
		else    
			cout << "输入错误" << endl;   
		cout << "继续输入吗(y/n)?";    
		cin >> ch;  
	} while (ch=='y');  
	
	cout << "优秀学生或教师" << endl;  
	for (int i=0;i<count;i++)   
		if (p[i]->isgood()==True)      //若为优秀,则输出之    
	p[i]->printname(); 
	
	return 0;
} 

输出结果

关于Program Language更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.

抱歉!评论已关闭.