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

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

以下內容是關于在C++中const 用法求解,求助~

以下內容是關于在C++中const 用法求解,求助~

C++
縹緲止盈 2021-11-25 21:15:20
#include"iostream"using namespace std;class A{public:virtual void f(){cout<<"A::f()"<<endl;}void f()const{cout<<"A::f() const"<<endl;}};class B: public A{public:void f(){cout<<"B::f()"<<endl;}void f()const{cout<<"B::f() const"<<endl;}};void g(const A* a){a->f();} int main(){A* a=new B();a->f();g(a);delete a;system("pause");return 0;}求解 g(a)輸出為什么是A::f() const當將函數g(const A*a)中const 去掉是輸出結果為B::f()
查看完整描述

2 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

g(const A*a)時,傳入的是B類對象指針,B類繼承A類void f()const,a只能訪問B繼承的A的部分。
const修飾的對象只能調用const成員函數,a->f();輸出A::f() const
而去掉const后,A類指針被子類初始化,a->f(),根據虛函數帶來的多態性,具體調用哪個函數由運行時確定,發現this指向B類,所以輸出B::f()

查看完整回答
反對 回復 2021-11-29
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

首先,a是一個指向B類對象的指針。

其次,
void f()const{
cout<<"A::f() const"<<endl;
}
的const是函數的“特征標”之一,所以,這個f函數和另一個f函數構成重載。

最后,常對象(或者是指向常對象的指針),將會調用const函數,如果沒有const函數只有非const函數,將報錯;非常對象(即沒有被const修飾的普通對象)則會優先調用非const函數,如果沒有非const函數只有const函數,將會調用const函數。

然后是分析:

求解 g(a)輸出為什么是A::f() const
答:因為g函數接收到參數后,給它加了個const修飾,所以,g函數內的a是一個指向常對象的指針。void f()const這個函數不是虛函數,所以它被B類直接繼承了,意思是說,B類其實是有一個
void f()const{
cout<<"A::f() const"<<endl;
}
這樣的函數的。然后,g內的a->f();調用的就是B類(因為a是一個指向B類對象的指針)里的void f()const函數。

當將函數g(const A*a)中const 去掉是輸出結果為B::f()
答:去掉const之后,g函數里的a只是一個指向非常對象(即沒有被const修飾的普通對象)的指針,將會優先調用非const函數,B中剛好有一個重寫了A類那個沒有const的f函數的f函數,所以就調用了它。



查看完整回答
反對 回復 2021-11-29
  • 2 回答
  • 0 關注
  • 299 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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