[問題] C++ 繼承 object model layout 問題

看板C_and_CPP作者 (gecer)時間8年前 (2017/10/23 09:24), 8年前編輯推噓3(308)
留言11則, 4人參與, 8年前最新討論串1/2 (看更多)
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

10/23 09:41, 8年前 , 1F
你寫的syntax是C++嗎...?
10/23 09:41, 1F

10/23 09:42, 8年前 , 2F
基本上你可以想像成會有一個non-member function第一個參數
10/23 09:42, 2F

10/23 09:42, 8年前 , 3F
就是this
10/23 09:42, 3F

10/23 09:49, 8年前 , 4F
原 PO 你是否之前是寫 java 的?
10/23 09:49, 4F

10/23 09:49, 8年前 , 5F
你的 class 語法看起來很像 java, 但 java 沒有寫 * 的指標
10/23 09:49, 5F

10/23 15:17, 8年前 , 6F
你的Emplyee和Hourlyworker應該有繼承的關係,不然指標
10/23 15:17, 6F

10/23 15:18, 8年前 , 7F
會給不過去;另外,繼承的話不是virtual同名同參數就當
10/23 15:18, 7F

10/23 15:18, 8年前 , 8F
作被蓋掉了吧~
10/23 15:18, 8F
修改成c++語法 ※ 編輯: gecer (111.255.9.13), 10/23/2017 20:00:57

10/23 20:20, 8年前 , 9F
沒有virtual的話,就直接呼叫ePtr類別的print而已
10/23 20:20, 9F

10/23 20:21, 8年前 , 10F
ePtr->print() 會相當於 Employee::print(ePtr)
10/23 20:21, 10F

10/23 20:21, 8年前 , 11F
而不會管你指標實際是指向什麼,也不會有查表的動作
10/23 20:21, 11F
文章代碼(AID): #1PxKIzI8 (C_and_CPP)
文章代碼(AID): #1PxKIzI8 (C_and_CPP)