[問題] 繼承時的函數呼叫

看板C_and_CPP (C/C++)作者時間16年前 (2010/02/20 10:15), 編輯推噓4(4011)
留言15則, 4人參與, 最新討論串1/1
請問為什麼下列程式碼的cout會是 Employee's Sal Employee's Tax Staff's bonus Staff's Tax 3700 為什麼會先呼叫Employeee::Tax (Staff本身不是也有Tax?) 最後又會呼叫Staff::bonus和Staff::Tax ? (Tax用employee的,bonus用Staff的?) 開發平台:g++ , Linux 程式碼 #include <iostream> using namespace std; class Employee { public: Employee(int s) { salary = s; } virtual int Sal() { cout << "Employee's Sal\n"; return salary - Tax() + bonus(); } int Tax() { cout << "Employee's Tax\n"; return int(salary * 0.2); } virtual int bonus() { cout << "Employee's bonus\n"; return 0; } protected: int salary; }; class Staff : public Employee { public: Staff(int salary) : Employee(salary + 1000) {} virtual int Tax() { cout << "Staff's Tax\n"; return int(salary * 0.1); } int bonus() { cout << "Staff's bonus\n"; return Tax()+100; } }; int main() { Staff s(3000); cout << s.Sal() << endl; return 0; } ※ 編輯: feathersss 來自: 203.67.223.239 (02/20 10:18)

02/20 10:28, , 1F
virtual的用法再看一下@@
02/20 10:28, 1F

02/20 10:35, , 2F
是說virtal的效果在使用object呼叫function時也會有?
02/20 10:35, 2F

02/20 13:48, , 3F
this被轉型成 Employee 所以 Employee->bonus 會跑兒子吧
02/20 13:48, 3F

02/20 13:48, , 4F
dynamic binding
02/20 13:48, 4F

02/20 13:51, , 5F
你Tax沒有virtual 所以 老爸->Tax只會跑老爸的
02/20 13:51, 5F

02/20 13:52, , 6F
不然你可以把 老爸的Tax遮掉 根本認不到
02/20 13:52, 6F

02/20 13:53, , 7F
或是把老爸的 Tax加上virtual他就跑兒子了
02/20 13:53, 7F

02/20 22:23, , 8F
小弟不了解的是為什麼會啟動dynamic binding
02/20 22:23, 8F

02/20 22:23, , 9F
不是要pointer或reference才會發生?
02/20 22:23, 9F

02/21 00:10, , 10F
你知道this嗎? 你呼叫bonus 就= this->bonus();
02/21 00:10, 10F

02/21 07:42, , 11F
嗯 我知道 所以說在member function裡呼叫本身的number
02/21 07:42, 11F

02/21 07:42, , 12F
function時,其實都是"this->函數名字"的意思?
02/21 07:42, 12F

02/21 12:20, , 13F
數字函數 ~"~
02/21 12:20, 13F

02/21 19:29, , 14F
是 但叫做 member function 不是number
02/21 19:29, 14F

02/21 20:45, , 15F
ㄜ 打錯字 這樣我了解了 謝謝大大的解答
02/21 20:45, 15F
※ 編輯: feathersss 來自: 203.70.101.163 (02/21 20:51)
文章代碼(AID): #1BVqNEzN (C_and_CPP)
文章代碼(AID): #1BVqNEzN (C_and_CPP)