2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個贊
g(const A*a)時,傳入的是B類對象指針,B類繼承A類void f()const,a只能訪問B繼承的A的部分。
const修飾的對象只能調(diào)用const成員函數(shù),a->f();輸出A::f() const
而去掉const后,A類指針被子類初始化,a->f(),根據(jù)虛函數(shù)帶來的多態(tài)性,具體調(diào)用哪個函數(shù)由運(yùn)行時確定,發(fā)現(xiàn)this指向B類,所以輸出B::f()

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個贊
首先,a是一個指向B類對象的指針。
其次,
void f()const{
cout<<"A::f() const"<<endl;
}
的const是函數(shù)的“特征標(biāo)”之一,所以,這個f函數(shù)和另一個f函數(shù)構(gòu)成重載。
最后,常對象(或者是指向常對象的指針),將會調(diào)用const函數(shù),如果沒有const函數(shù)只有非const函數(shù),將報錯;非常對象(即沒有被const修飾的普通對象)則會優(yōu)先調(diào)用非const函數(shù),如果沒有非const函數(shù)只有const函數(shù),將會調(diào)用const函數(shù)。
然后是分析:
求解 g(a)輸出為什么是A::f() const
答:因?yàn)間函數(shù)接收到參數(shù)后,給它加了個const修飾,所以,g函數(shù)內(nèi)的a是一個指向常對象的指針。void f()const這個函數(shù)不是虛函數(shù),所以它被B類直接繼承了,意思是說,B類其實(shí)是有一個
void f()const{
cout<<"A::f() const"<<endl;
}
這樣的函數(shù)的。然后,g內(nèi)的a->f();調(diào)用的就是B類(因?yàn)閍是一個指向B類對象的指針)里的void f()const函數(shù)。
當(dāng)將函數(shù)g(const A*a)中const 去掉是輸出結(jié)果為B::f()
答:去掉const之后,g函數(shù)里的a只是一個指向非常對象(即沒有被const修飾的普通對象)的指針,將會優(yōu)先調(diào)用非const函數(shù),B中剛好有一個重寫了A類那個沒有const的f函數(shù)的f函數(shù),所以就調(diào)用了它。
- 2 回答
- 0 關(guān)注
- 307 瀏覽
添加回答
舉報