博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序实践系列(九)多态性和虚函数
阅读量:6910 次
发布时间:2019-06-27

本文共 3419 字,大约阅读时间需要 11 分钟。

理论练习题 

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

输出结果

关于很多其它讨论与交流,敬请关注本博客和新浪微博.

转载于:https://www.cnblogs.com/clnchanpin/p/6854071.html

你可能感兴趣的文章
[转载]git 忽略某些文件
查看>>
jQuery 效果 - 隐藏和显示
查看>>
正则表达式的使用
查看>>
Android复制iPhone日期和时间选择器
查看>>
[C语言]进阶|指针与字符串
查看>>
检测ORACLE方法汇总数据块损坏
查看>>
Binary Tree Maximum Path Sum [leetcode] dp
查看>>
Xamarin.Android开发实践(八)
查看>>
JSON 常用数据转换
查看>>
MongoDB系列一(索引及C#如何操作MongoDB)
查看>>
解决Android SDK下载和更新失败的方法(Win系统) 和离线安装
查看>>
解决eclipse+MAVEN提示One or more constraints have not been satisfied.的问题
查看>>
nginx主配置文件 在那找怎么打开
查看>>
Android:Intent
查看>>
C++标准转换运算符const_cast
查看>>
【Cocos2d-x】Mac 在 Cocos2d-x 3.X 打包Android
查看>>
测试计划与测试方案的区别
查看>>
Hadoop 读取文件API报错
查看>>
JS实现密码加密
查看>>
HTML+CSS-如何定义让两个div横向排列
查看>>