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

作者: gecer (gecer)   2017-10-23 09:24:10
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
作者: PkmX (阿貓)   2017-10-23 09:41:00
你寫的syntax是C++嗎...?基本上你可以想像成會有一個non-member function第一個參數就是this
作者: LPH66 (-6.2598534e+18f)   2017-10-23 09:49:00
原 PO 你是否之前是寫 java 的?你的 class 語法看起來很像 java, 但 java 沒有寫 * 的指標
作者: peterwu4 (notd)   2017-10-23 15:17:00
你的Emplyee和Hourlyworker應該有繼承的關係,不然指標會給不過去;另外,繼承的話不是virtual同名同參數就當作被蓋掉了吧~
作者: james732 (好人超)   2017-10-23 20:20:00
沒有virtual的話,就直接呼叫ePtr類別的print而已ePtr->print() 會相當於 Employee::print(ePtr)而不會管你指標實際是指向什麼,也不會有查表的動作

Links booklink

Contact Us: admin [ a t ] ucptt.com