作者gecer (gecer)
看板C_and_CPP
標題[問題] C++ 繼承 object model layout 問題
時間Mon Oct 23 09:24:10 2017
class Employee{
public:
print()
{//do Employee method}
};
class Hourlyworker:public Employee{
public:
print()
{//do Hourworker method}
};
Employeee e, *ePtr=&e;
Hourlyworker h,*hPtr=&h;
ePtr->print();//do Employee method
hPtr->print();//do Hourworker method
ePtr=&h;
ePtr->print();//do Employee method
黃色部分 若將print 改成 virtual function 便會do Hourlyworker method 教科書上也
說這是因為使用virtual function會去call vtable的關係object model 如同下列layout
http://www.geeksforgeeks.org/wp-content/uploads/virtualFuns1.png
到這裡小弟可理解 但是小弟想請教若無使用virtual function 時 黃色部分的 ePtr
object model layout會是什麼樣子?ePtr已point &h它是如何call到do Employee method
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.255.9.13
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1508721853.A.488.html
※ 編輯: gecer (111.255.9.13), 10/23/2017 09:24:50
※ 編輯: gecer (111.255.9.13), 10/23/2017 09:25:56
※ 編輯: gecer (111.255.9.13), 10/23/2017 09:26:29
→ PkmX: 你寫的syntax是C++嗎...? 10/23 09:41
→ PkmX: 基本上你可以想像成會有一個non-member function第一個參數 10/23 09:42
→ PkmX: 就是this 10/23 09:42
推 LPH66: 原 PO 你是否之前是寫 java 的? 10/23 09:49
→ LPH66: 你的 class 語法看起來很像 java, 但 java 沒有寫 * 的指標 10/23 09:49
推 peterwu4: 你的Emplyee和Hourlyworker應該有繼承的關係,不然指標 10/23 15:17
→ peterwu4: 會給不過去;另外,繼承的話不是virtual同名同參數就當 10/23 15:18
→ peterwu4: 作被蓋掉了吧~ 10/23 15:18
修改成c++語法
※ 編輯: gecer (111.255.9.13), 10/23/2017 20:00:57
推 james732: 沒有virtual的話,就直接呼叫ePtr類別的print而已 10/23 20:20
→ james732: ePtr->print() 會相當於 Employee::print(ePtr) 10/23 20:21
→ james732: 而不會管你指標實際是指向什麼,也不會有查表的動作 10/23 20:21