description
新學期伊始,某班要通過競爭上崗方式競選班幹部。包括班長、團支書等。現在需要你來設計2個類student和studentcadre來模擬這一過程。
1.student類是學生類,包括
(2)方法:
建構函式student(string _name, bool _***, int _grade)——初始化乙個物件。注意:其中的next初始化為null。
析構函式。
void showinfo()——輸出乙個學生的資訊。next除外。
student* getnext()——獲得next指標。
void setnext(student*)——設定next指標指向物件。
studentcadre類是student類的派生類,包括:
(1)屬性:string position——表示競聘崗位。
(2)方法:
studentcadre(string _name, bool _***, int _grade, string pos)——建構函式,初始化各種屬性。
析構函式。
void showinfo()——顯示資訊。
建構函式和析構函式都有輸出,具體見樣例。
input
輸入有多行。
第1行有4部分:姓名、性別(0或1)、年級(整數)和崗位。
第2行是乙個正整數n,表示有n個學生支援該人競聘相應崗位。之後有n行,每行有3個部分,分別是乙個學生的姓名、性別和年級。
output
見樣例。
sample input
tom 0 2015 monitor
3 jack 1 2015
mary 0 2015
sherry 1 2015
sample output
a student named by tom is created!
a student cadre with position monitor is created.
a student named by jack is created!
a student named by mary is created!
a student named by sherry is created!
name = tom, *** = 0, grade = 2015; position = monitor.
name = jack, *** = 1, grade = 2015;
name = mary, *** = 0, grade = 2015;
name = sherry, *** = 1, grade = 2015;
a student named by tom is erased.
a student named by jack is erased.
a student named by mary is erased.
a student named by sherry is erased.
hint
string類是c++提供的類,在標頭檔案string中,可以用#include
來使用這個類。該類的物件可以直接利用賦值運算子(=)進行複製,也可以直接利用cout輸出,或利用cin輸入。
int main()
((studentcadre*)header) -> showinfo();
cout<
curstudent =
header;
while (curstudent -> getnext() !=
null)
curstudent =
header;
while (curstudent !=
null)
return
0;}
ac**
#include
using
namespace
std;
class student
student* getnext()
void setnext(student*i)
};class studentcadre:public student
};int main()
((studentcadre*)header) -> showinfo();
cout
getnext() != null)
return
0;}#include
using
namespace
std;
class student
void setnext(student* i)
void showinfo()
~student()//這裡呼叫student中的showinfo時,直接用::的方式呼叫就好,不需要用cout
};int main()
((studentcadre*)header) -> showinfo();//因為前面有(studentcadre*),所以相當於是呼叫studentcadre裡面的showinfo;
//header剛開始設定的是student型別的,所以header還是基類的指標,只不過指向了派生類的物件
cout
/注意這裡有endl,所以在showinfo()裡面就不必再用endl了;
curstudent = header;//這裡又讓curstudent指向了開頭;
while (curstudent -> getnext() != null)//這裡是從開頭乙個個重新迴圈;
return
0;}
1、在這個題中,header是鍊錶的頭,curstudent是當前位置的學生,student是用來新增新的學生的。
2、curstudent是當前位置的學生,是因為剛開始指向了header,後來指向了next,可以很靈活地在不同位置之間移動,所以是當前位置。
3、header = new studentcadre(name, ***, grade,position);
這裡在做煉表頭的同時也賦值,並且也輸出了;
4、設定next的位址的時候是直接把乙個位址給它;即next=i;
5、只能把派生類物件賦值給基類,而不能把基類賦值給派生類。
實際上執行的只是基類定義的賦值運算子函式,該函式只能處理基類自己的資料成員。當用派生類物件初始化基類物件時,實際上也只呼叫基類的建構函式,該函式只能初始化基類定義的成員,派生類多餘的部分是沒有用的;
(1)在非指標或者非引用的情況下把派生類賦值給基類,在完成賦值或者初始化操作後,基類物件與派生類物件就沒有關係了。
沒有關係了所以就不能呼叫派生類中沒有的成員。
(2)在指標或者引用的情況下把派生類賦值給基類,指標或者引用從來就沒有生成新物件,它們操作的是派生類物件內部的基類子物件。
只有指標或者引用的時候可以呼叫派生類中沒有的成員,但是在呼叫這些成員的時候要進行強制型別轉換。
下圖就是進行強制型別準換的例項:
因此在這個題裡面:`header還是基類的指標,只不過指向了派生類的物件,因為是指標進行的派生類向基類的賦值,因此可以強制呼叫派生類中基類沒有的成員。
選舉班幹部了
problem b 選舉班幹部了!time limit 1 sec memory limit 128 mb submit 3942 solved 2376 submit status description 新學期伊始,某班要通過競爭上崗方式競選班幹部。包括班長 團支書等。現在需要你來設計2個類st...