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()

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函數,所以就調用了它。
- 2 回答
- 0 關注
- 299 瀏覽
添加回答
舉報