作者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://webptt.com/cn.aspx?n=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
1F:→ PkmX: 你写的syntax是C++吗...? 10/23 09:41
2F:→ PkmX: 基本上你可以想像成会有一个non-member function第一个参数 10/23 09:42
3F:→ PkmX: 就是this 10/23 09:42
4F:推 LPH66: 原 PO 你是否之前是写 java 的? 10/23 09:49
5F:→ LPH66: 你的 class 语法看起来很像 java, 但 java 没有写 * 的指标 10/23 09:49
6F:推 peterwu4: 你的Emplyee和Hourlyworker应该有继承的关系,不然指标 10/23 15:17
7F:→ peterwu4: 会给不过去;另外,继承的话不是virtual同名同参数就当 10/23 15:18
8F:→ peterwu4: 作被盖掉了吧~ 10/23 15:18
修改成c++语法
※ 编辑: gecer (111.255.9.13), 10/23/2017 20:00:57
9F:推 james732: 没有virtual的话,就直接呼叫ePtr类别的print而已 10/23 20:20
10F:→ james732: ePtr->print() 会相当於 Employee::print(ePtr) 10/23 20:21
11F:→ james732: 而不会管你指标实际是指向什麽,也不会有查表的动作 10/23 20:21