C_and_CPP 板


LINE

居然没人回 ※ 引述《dreamboat66 (小嫩)》之铭言: : 以下是我的测试程式 : https://ideone.com/B9vCuB : 这是main函数 想逐步询问一些观念是否有误 : int main() { : C* ptr = new C; : cout << "((A*)ptr):" << ((A*)ptr) << endl; : // 这边会有一个sizeof(void*)的offset差距是因为 C中其实含有A::和B::vptr : // 他必须shift一个offset到&B::vptr? : cout << "((B*)ptr):" << ((B*)ptr) << endl; 基本上这是实做的细节,但原因基本上就是因为 C 里面有 A 和 B 的 vtbl 的 pointer : ptr->A::Test(1); : // 这边我指定B:: 所以她也是要从 "&B::vptr" 开始, 所以this 有shift offset? : ptr->B::Test(2.2f); 如果 member function 有 qualification, 这样是直接指定要呼叫 B::Test,把 ptr 从 C* 转成 B* 当作 this 传入, 并不会有 dynamic dispatch 的功能 : ((A*)ptr)->Test(1); : //这边我不太能理解 他为什麽能够把this "退回" 到 ptr 而不是 (B*)ptr? : ((B*)ptr)->Test(2.2f); 这就跟你写 B* b = ptr; b->Test(0.0f); 一样的道理 : //刻意转成void* : void* ptrA = ((A*)ptr); : void* ptrB = ((B*)ptr); : ((A*)ptrA)->Test(1); : // 我可以解读说 他在B::vptr指向的vtable中找Test 是C::有override : // 所以她知道要"退回"到ptr? : ((B*)ptrB)->Test(2.2f); 你这边等於先用 static_cast 把 C* 变成 B*, 再用 reinterpret_cast 将 B* 转成 void*, 然後再用一次 reinterpret_cast 将 void* 转成 B*, 後面两个基本上是抵销掉没有用处的, 所以这个例子和上面的 ((B*) ptr)->Test(2.2f) 一样 : // 这边故意写错, 是不是就让他去A::vptr里面找错vtable所以Test就走到 : // A::Test(int)被C::Test给override的版本? : ((B*)ptrA)->Test(2.2f); C* -> B* -> void* -> A* 的最後一个 reinterpret_cast 是 undefined behavior (UB) : // 这边我只是想要确认一下override 两个不相干却同名字的virtual function : // 是不是A::Same跟B::Same同时都会被override 并且也没有写法能够让他们走 : // 不同的实作? : // 如果观念没错 是不是 A::vptr 和B::vptr 所指向的vtable里面分别都有 : // Same的entry(想确定是不是有两份override) 是的,如果要 override 相同 signature 的函式但是不同实做,有一个方法: struct a { virtual int f() = 0; }; struct b { virtual int f() = 0; }; struct a_impl : a { virtual int f() override { return 1; } }; struct b_impl : b { virtual int f() override { return 2; } }; struct c : a_impl, b_impl {}; c x; static_cast<a&>(x).f(); // 1 static_cast<b&>(x).f(); // 2 : ((A*)ptrA)->Same(); : ((B*)ptrB)->Same(); : ((B*)ptrA)->Same(); 最後这个是 UB,原因同上 : ptr->Same(); : return 0; : } : 以上是我自己解读的, 如果有错误, 请各位矫正一下观念 : 谢谢 大guy就是这样 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.193.217
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1507293958.A.01D.html
1F:推 dreamboat66: 谢谢你 我大概了解了 多了一些认识 10/06 21:52
※ 编辑: PkmX (140.113.193.217), 10/06/2017 22:29:56
2F:推 dreamboat66: 所以不做static_cast<a&>(x).f() ,直接使用x.f()会am 10/08 02:44
3F:→ dreamboat66: biguity? 10/08 02:44
4F:→ PkmX: 会 因为 c 里面有两份 f() 10/08 02:51







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP