[问题] 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