第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如下關(guān)于繼承與派生的一些問題,求解析~

如下關(guān)于繼承與派生的一些問題,求解析~

函數(shù)式編程 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(); //只調(diào)用基類的calc(),不會調(diào)用派生類的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(); 他調(diào)用的函數(shù)仍然是基類的呢[2]如果希望fn(Do);和第2條pb->calc();語句調(diào)用的是派生類的calc()函數(shù),應(yīng)該怎樣修改程序?[3]我突發(fā)奇想 把void fn(B &t) 函數(shù) 形參改為void fn(D &t) 結(jié)果發(fā)生錯誤 請問這是為什么呢
查看完整描述

1 回答

?
慕無忌1623718

TA貢獻(xiàn)1744條經(jīng)驗 獲得超4個贊

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


查看完整回答
反對 回復(fù) 2022-07-11
  • 1 回答
  • 0 關(guān)注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號