课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接

【项目1 - 存储班长信息的学生类】

class Stu   //声明基类
{
public:
Stu(int n, string nam ); //基类构造函数
void display( ); //成员函数。输出基类数据成员
protected: //(*)訪问权限为保护型的数据成员
int num; //学生学号
string name; //学生姓名
};
class StuDetail: public Stu //声明派生类StuDetail
{
public:
//学生nam,学号n,a岁。家住ad,他的班长是nam1,学号n1
StuDetail(int n, string nam,int a, string ad,int n1, string nam1); //派生类构造函数
void show( ); //成员函数。输出学生的信息
void show_monitor( ); //成员函数。输出班长信息
private:
Stu monitor; //学生所在班的班长。班长是学生,是Stu类的成员
int age; //学生年龄
string addr; //学生的住址
};
int main( )
{
//学生王力,10010号,19岁。家住上海的北京路,他的班长是李孙,学号10001
StuDetail s(10010,"Wang-li",19,"115 Beijing Road,Shanghai",10001,"Li-sun");
s.show( ); //输出学生信息
s.show_monitor(); //输出班长信息
return 0;
}

(1)上面是声明好的类及測试函数。请完毕类中成员函数的定义。使执行结果如图所看到的。


(2)将Stu类的数据成员的訪问权限改为private,你的程序能否完毕要求的功能?假设不行,请改动程序。请不要改动给出的代码,仅仅能改动自己写的代码。

參考解答:

(1)

#include <iostream>
#include <string>
using namespace std;
class Stu //声明基类
{
public:
Stu(int n, string nam ); //基类构造函数
void display( ); //成员函数,输出基类数据成员
protected: //訪问权限为保护型的数据成员
int num; //学生学号
string name; //学生姓名
};
Stu::Stu(int n, string nam ): num(n),name(nam){} //基类构造函数
void Stu::display( ) //成员函数,输出基类数据成员
{
cout<<"学号: "<<num<<endl;
cout<<"姓名: "<<name<<endl;
} class StuDetail: public Stu //声明公用派生类StuDetail
{
public:
//学生nam,学号n,a岁,家住ad,他的班长是nam1,学号n1
StuDetail(int n, string nam,int a, string ad,int n1, string nam1); //派生类构造函数
void show( );
void show_monitor( ); //成员函数,输出子对象
private:
Stu monitor; //学生所在班的班长,班长是学生,用Stu声明
int age; //学生年龄
string addr; //学生的住址
}; StuDetail::StuDetail(int n, string nam,int a,string ad,int n1,string nam1):
Stu(n,nam),monitor(n1,nam1),age(a),addr(ad){} //派生类构造函数 void StuDetail::show( )
{
cout<<"学生信息:"<<endl;
cout<<"学号: "<<num<<endl; //输出num和name
cout<<"姓名: "<<name<<endl;
cout<<"年龄: "<<age<<endl; //输出age
cout<<"住址: "<<addr<<endl<<endl; //输出addr
}
void StuDetail::show_monitor( ) //成员函数,输出子对象
{
cout<<"班长信息:"<<endl;
monitor.display( ); //调用基类成员函数
} int main( )
{
//学生王力,10010号。19岁,家住上海的北京路,他的班长是李孙,学号10001
StuDetail s(10010,"Wang-li",19,"115 Beijing Road,Shanghai",10001,"Li-sun");
s.show( ); //输出学生的数据
s.show_monitor(); //输出子对象的数据
return 0;
}

(2)当Stu类的数据成员訪问权限改为private后,39和40行訪问基类的私有数据成员,出错是必定的。

||=== example, Debug ===|
F:\C++\codeBlock\example\main.cpp||In member function 'void StuDetail::show()':|
F:\C++\codeBlock\example\main.cpp|10|error: 'int Stu::num' is private|
F:\C++\codeBlock\example\main.cpp|39|error: within this context|
F:\C++\codeBlock\example\main.cpp|11|error: 'std::string Stu::name' is private|
F:\C++\codeBlock\example\main.cpp|40|error: within this context|
||=== Build finished: 4 errors, 0 warnings (0 minutes, 0 seconds) ===|

改法1:

  再改回去!

基类中的数据成员用protected的做法是一般的做法。

  既然如今“捣乱”,也不这样做了。

改法2:

  在基类Stu中。添加两个公用的get函数。在子类中訪问时,输出get函数的结果。注意9、10行加的函数,以及41、42行改过的输出。

#include <iostream>
#include <string>
using namespace std;
class Stu //声明基类
{
public:
Stu(int n, string nam ); //基类构造函数
void display( ); //成员函数,输出基类数据成员
int getNum(){return num;}
string getName(){return name;}
private: //訪问权限为保护型的数据成员
int num; //学生学号
string name; //学生姓名
};
Stu::Stu(int n, string nam ): num(n),name(nam){} //基类构造函数
void Stu::display( ) //成员函数。输出基类数据成员
{
cout<<"学号: "<<num<<endl;
cout<<"姓名: "<<name<<endl;
} class StuDetail: public Stu //声明公用派生类StuDetail
{
public:
//学生nam。学号n。a岁,家住ad,他的班长是nam1,学号n1
StuDetail(int n, string nam,int a, string ad,int n1, string nam1); //派生类构造函数
void show( );
void show_monitor( ); //成员函数,输出子对象
private:
Stu monitor; //学生所在班的班长,班长是学生,用Stu声明
int age; //学生年龄
string addr; //学生的住址
}; StuDetail::StuDetail(int n, string nam,int a,string ad,int n1,string nam1):
Stu(n,nam),monitor(n1,nam1),age(a),addr(ad){} //派生类构造函数 void StuDetail::show( )
{
cout<<"学生信息:"<<endl;
cout<<"学号: "<<getNum()<<endl; //输出num和name
cout<<"姓名: "<<getName()<<endl;
cout<<"年龄: "<<age<<endl; //输出age
cout<<"住址: "<<addr<<endl<<endl; //输出addr
}
void StuDetail::show_monitor( ) //成员函数,输出子对象
{
cout<<"班长信息:"<<endl;
monitor.display( ); //调用基类成员函数
} int main( )
{
//学生王力。10010号,19岁。家住上海的北京路。他的班长是李孙,学号10001
StuDetail s(10010,"Wang-li",19,"115 Beijing Road,Shanghai",10001,"Li-sun");
s.show( ); //输出学生的数据
s.show_monitor(); //输出子对象的数据
return 0;
}

改法3:

  注意到基类Stu中已经提供了显示的display函数,是公共的,派生类中当然能够直接訪问了。

于是,在StuDetail::show函数中调用即可了。注意以下程序的第39行:

#include <iostream>
#include <string>
using namespace std;
class Stu //声明基类
{
public:
Stu(int n, string nam ); //基类构造函数
void display( ); //成员函数。输出基类数据成员
private: //訪问权限为保护型的数据成员
int num; //学生学号
string name; //学生姓名
};
Stu::Stu(int n, string nam ): num(n),name(nam){} //基类构造函数
void Stu::display( ) //成员函数,输出基类数据成员
{
cout<<"学号: "<<num<<endl;
cout<<"姓名: "<<name<<endl;
} class StuDetail: public Stu //声明公用派生类StuDetail
{
public:
//学生nam,学号n。a岁,家住ad。他的班长是nam1。学号n1
StuDetail(int n, string nam,int a, string ad,int n1, string nam1); //派生类构造函数
void show( );
void show_monitor( ); //成员函数,输出子对象
private:
Stu monitor; //学生所在班的班长。班长是学生,用Stu声明
int age; //学生年龄
string addr; //学生的住址
}; StuDetail::StuDetail(int n, string nam,int a,string ad,int n1,string nam1):
Stu(n,nam),monitor(n1,nam1),age(a),addr(ad){} //派生类构造函数 void StuDetail::show( )
{
cout<<"学生信息:"<<endl;
display();
cout<<"年龄: "<<age<<endl; //输出age
cout<<"住址: "<<addr<<endl<<endl; //输出addr
}
void StuDetail::show_monitor( ) //成员函数,输出子对象
{
cout<<"班长信息:"<<endl;
monitor.display( ); //调用基类成员函数
} int main( )
{
//学生王力。10010号,19岁。家住上海的北京路,他的班长是李孙,学号10001
StuDetail s(10010,"Wang-li",19,"115 Beijing Road,Shanghai",10001,"Li-sun");
s.show( ); //输出学生的数据
s.show_monitor(); //输出子对象的数据
return 0;
}

=================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类文件夹(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道。和学生一起享受快乐和激情的大学 =====

C++第11周(春)项目1 - 存储班长信息的学生类的更多相关文章

  1. C++走向远洋——(项目二、存储班长信息的学生类、派生)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. C++第15周(春)项目2 - 用文件保存的学生名单

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 本程序中须要的相关文件.请到http://pa ...

  3. C++第11周(春)项目2 - 职员有薪水了

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目2 - 职员有薪水了]定义一个名为CPe ...

  4. C++第11周(春)项目3 - 点类派生直线类

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 [项目3 - 点类派生直线类]定义点类Poin ...

  5. C++第11周(春)项目4 - 类族的设计

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目4 - 类族的设计]按下面的提示,由基类 ...

  6. 2013级C++第15周(春)项目——输入输出流及文件文件操作

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 本周程序阅读及程序调试中须要的文件,请到htt ...

  7. 2013级C++第13周(春)项目——继承的进一步话题与GUI应用开发

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读:阅读以下类的定义,请说出在 ...

  8. C++第12周(春)项目2 - &quot;双肩挑&quot;教师

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目2 - 教师兼干部类](第11章习题9) ...

  9. 2013级C++第12周(春)项目——成员的訪问属性、多重继承

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读 1.阅读程序.分析类中成员 ...

随机推荐

  1. POJ 1862 &amp; ZOJ 1543 Stripies(贪心 | 优先队列)

    题目链接: PKU:http://poj.org/problem?id=1862 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  2. Abot 爬虫

    Abot 爬虫分析-整体结构 1. 引言 在Github 上搜索下Web Crawler 有上千个开源的项目,但是C#的仅仅只有168 个,相比于Java 或者Python 确实少的可怜.如果按照St ...

  3. HDU 1535 Invitation Cards(SPFA,及其优化)

    题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...

  4. CSS——inline-block属性

    Inline-block 是元素 display属性的一个值 .这个名字的由来是因为,可以简单的解释为inline+block :display设置这个值的元素,兼具行内元素( inline elem ...

  5. VCL改变主窗体的方法

    使用如下语句即可Pointer((@Application.MainForm)^) := Form1; 仔细想想和Pointer((Application.MainForm)) := Form1;有什 ...

  6. 分布式发布订阅消息系统Kafka

    高吞吐量的分布式发布订阅消息系统Kafka--安装及测试   一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...

  7. ZOJ 1610 间隔染色段树

    要长8000仪表板.间染色的范围,问:最后,能看到的颜色,而且颜色一共有段出现 覆盖段 数据对比水   水可太暴力 段树: #include "stdio.h" #include ...

  8. 3p

    哈,不要自卑.爱情和婚姻可遇不可求,缘到自然成.首要的是人好,容貌別太差,毕竟天天在一起看着要舒心才好,另外应该有上进心,避免势利小人.这些,都要看机缘.所谓right person at right ...

  9. UVA 11768 - Lattice Point or Not(数论)

    UVA 11768 - Lattice Point or Not option=com_onlinejudge&Itemid=8&page=show_problem&categ ...

  10. sql语句查询数据库中的表名/列名/主键/自动增长值

    原文地址:http://blog.csdn.net/pukuimin1226/article/details/7687538 ----查询数据库中用户创建的表 ----jsj01 为数据库名 sele ...