zoukankan      html  css  js  c++  java
  • 程序实践系列(九)多态性和虚函数

    理论练习题 

    • 给出下面程序的运行结果。
    #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.

  • 相关阅读:
    30天敏捷生活(4): 撰写个人使命宣言
    [智力考题]比尔盖茨只有3分的考题
    推荐下载:MSN机器人源代码(C#),含自动IP地址查询、简单自动问答等(添加详细使用)
    [代码]包括所有特性的目录选择对话框
    开源数据库系统之SQLite3.2.0、FireBird2.0 Alpha1等
    [建议]添加模板功能
    到底SQLite有多强?在我的2台机器上的压力测试
    OMEA Pro,刚刚荣获15届Jolt大奖,综合RSS阅读,邮件、任务等管理的IIM(智能信息管理)
    关于DotNetNuke(DNN)的语言问题
    写你自己的反编译/混淆器
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6854071.html
Copyright © 2011-2022 走看看