亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如下關于繼承與派生的一些問題,求解析~

如下關于繼承與派生的一些問題,求解析~

函數式編程 2022-07-07 11:07:58
這是程序#include <iostream.h>class B //基類{protected:int x,y;public:B(int a=10,int b=20):x(a),y(b){ }void calc() //基類有calc(){cout <<"x+y=" <<x+y <<endl;}};class D: public B //公有派生類{protected:int z;public:D(int a=1,int b=2,int c=3):B(a,b),z(c){}void calc( ) //派生類也有calc(){ cout <<"z+x+y=" <<z+x+y <<endl; }};void fn(B &t) //形參為基類的引用{t.calc(); //只調用基類的calc(),不會調用派生類的calc()}int main(){B Bo, *pb;D Do;cout<<"call Bo.calc():";Bo.calc();cout<<"call Do.calc():";Do.calc();cout<<"call Bo.calc():";fn(Bo);cout<<"call Do.calc():";fn(Do);pb=&Bo; //基類對象的指針指向基類對象pb->calc();pb=&Do; //基類對象的指針指向派生類對象pb->calc();return 0;}[1]請問為什么pb=&Do; pb->calc(); 他調用的函數仍然是基類的呢[2]如果希望fn(Do);和第2條pb->calc();語句調用的是派生類的calc()函數,應該怎樣修改程序?[3]我突發奇想 把void fn(B &t) 函數 形參改為void fn(D &t) 結果發生錯誤 請問這是為什么呢
查看完整描述

1 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

你的問題是涉及到繼承與覆蓋的問題....
c++ 重載 覆蓋 隱藏的區別和執行方式
成員函數被重載的特征
(1)相同的范圍(在同一個類中);
(2)函數名字相同;
(3)參數不同;
(4)virtual 關鍵字可有可無。
覆蓋是指派生類函數覆蓋基類函數,特征是
(1)不同的范圍(分別位于派生類與基類);
(2)函數名字相同;
(3)參數相同;
(4)基類函數必須有virtual 關鍵字。
“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)
3種情況怎么執行:1。重載:看參數2。隱藏:用什么就調用什么3。覆蓋:調用派生類
//////////////////////////////////////////////////////////////////////
也就是含有純虛函數的基類:
class A
{
public:
virtual void f() = 0;
};
class B : public A
{
public:
virtual void f()
{
cout < < "Hello, World! " < < endl;
}
};
像這樣,基類A中含有純虛函數,在派生類B中實現
///////////////////////////////////////////////////////////////////////////////
如果某個派生類的部分或全部直接基類是從另一個共同的基類派生而來,在這些基類中,從上一級基類繼承來的成員就有相同的名稱,則在這個派生類中訪問這個共同的基類中的成員時,可能會產生二義性,此時,可定義虛基類。這就要求在其直接基類的定義中,使用關鍵字virtual將那個共同的基類定義為虛基類,其語法形式如下:
class 派生類名: virtual 派生方式 基類
虛基類的初始化與一般的多重繼承的初始化在語法上是一樣的 ,但構造函數的調用順序不同,虛基類構造函數的調用順序是這樣規定的:
1)在同一層次中,先調用虛基類的構造函數,接下來依次是非虛基類的構造函數,對象成員的構造函數,派生類的構造函數。
2)若同一層次中包含多個虛基類,這些虛基類的構造函數按對他們說明的先后次序調用
3)若虛基類由非虛基類派生而來,則仍然先調用基類構造函數,再調用派生類構造函數。
///////////////////////////////////////////////////////////////////////////////
多繼承體系中:
class B{};
class A : public B{};
class C : public B{};
class D : public A, public C{};
A里有個B,C里也有個B,則D里會有兩個B。
如果
class B{};
class A : virtual public B{};
class C : virtual public B{};
class D : public A, public C{};
B是A,C,以及更高層D的虛基類,此時
A里有個B,C里也有個B,但D里只有一個B。
-------------------------------------------------------------------------------
前面是一些概念,下面是對你的一些提問進行回答(可能有誤,多指教):
【1】,calc(); 被基類calc();隱藏
【2】,class D: virtual public B 虛基類
【3】,void fn(B &t) 的形參是B &t,而形參改為void fn(D &t) 就會出錯


查看完整回答
反對 回復 2022-07-11
  • 1 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號