標籤:
問題描述:
(5)閱讀下面類的定義,請說出在測試函數中不同情況的調用產生的結果
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong>#include <iostream>using namespace std;class A{protected: int a,b;public: A(int aa, int bb):a(aa), b(bb) {} void printA() { cout<<"a: "<<a<<"\tb: "<<b<<endl; }};class B: public A{ int c;public: B(int aa, int bb, int cc):A(aa,bb),c(cc) {} void printB() { cout<<"a: "<<a<<"\tb: "<<b<<"\tc: "<<c<<endl; }};int main(){ A a(1,1); B b(2,3,4); //此處加入下面各小題中的代碼 return 0;}</strong></span>
(a)
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong> a=b; a.printA(); b.printA(); b.printB();</strong></span>
你認為輸出結果是:
a: 2 b:3
a: 2 b:3
a: 2 b:3 c:4
運行程式的結果是:
(b)
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong> b=a; a.printA(); b.printA(); b.printB();</strong></span>
程式會發生編譯錯誤,原因是:b繼承於a,b的資料成員包含但不等於a的資料成員。
記錄下IDE中提示的錯誤並理解:
(c)
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong> A &r1=a; A &r2=b; r1.printA(); r2.printA(); r2.printB();</strong></span>
將會發生錯誤的一行刪除;
對餘下的程式,你認為輸出是:
a: 1 b:1
a: 2 b:3
實際啟動並執行輸出是:
那一行的錯誤原因是:A &r2=b; r2是A的對象無法使用B的成員函數。
(d)
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong> A *p=&a; p->printA(); p=&b; p->printA(); p->printB();</strong></span>
將會發生錯誤的一行刪除;
對餘下的程式,你認為輸出是:
a: 1 b:1
a: 2 b:3
實際啟動並執行輸出是:那一行的錯誤原因是:p是一個指向A對象的指標,因為B繼承A所以可以執行
p=&b;p->printA();但是A中沒有printB();所以p->printB();錯誤無法執行。
(e)
在class A中增加成員函數:
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong> int getA(){return a;}</strong></span>
在main函數前增加一般函數:
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong>void f(A x){ cout<<"aaaaah, my a: "<<x.getA()<<endl;}</strong></span>
main函數中指定部分為:
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#ff6666;"><strong> f(a); f(b);</strong></span>
你認為輸出結果是:
aaaaah, my a: 1
aaaaah, my a: 2
運行程式的結果是:
第12周 《C++語言基礎》程式閱讀——多重繼承(5)