水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:今天掉进一个不算坑的坑
楼主
|
fanci
|
2020-10-20 21:50:26
|
展开
得亏我及时一通搜索搞定。是这样的:
有三个类 A, B, C,其中 A和B都非空,而C同时继承A和B,即 struct C : A, B {...};
那么从 C的指针 static_cast 到 B的指针是会改变指针的值的。我想计算这个偏移量(有几字节),于是我搞了这么个:
size_t offset = reinterpret_cast<size_t>(
static_cast<B*>(static_cast<C*>(nullptr)));
能看出这错误在哪儿吗?
--
FROM 138.19.103.*
4楼
|
fanci
|
2020-10-21 12:17:16
|
展开
可以,也可以用curiously recursive pattern实现mixin
【 在 hgoldfish () 的大作中提到: 】
: 多继承就是蛋疼。我一般没兴趣去研究错在哪里,直接奔着最佳实践去。我针对多继承的最佳实践是用模板:
:
: template<typename Base>
: class XxooMixin: public Base {};
--
FROM 203.145.95.*
5楼
|
fanci
|
2020-10-21 12:18:02
|
展开
答案是对的,结果总是零。
【 在 DoorWay () 的大作中提到: 】
: 没看懂你的思路。
: 指针不总是4字节8字节吗? sizeof(int)
: nullptr 是个结构体,隐式转换T* 的operator,用整型0转。
: C*转B*,还是个int 0。接着reinterpret_cast,就是将连续的
--
FROM 203.145.95.*
6楼
|
fanci
|
2020-10-21 12:19:59
|
展开
不是。
我来公布答案:把 nullptr 变成非零就可以实现预期的目的,但是 nullptr(或者0)就总是得零。
解释也很简单,见
https://devblogs.microsoft.com/oldnewthing/20160224-00/?p=93081
【 在 txgx () 的大作中提到: 】
: reinterpret_cast<size_t*> ?
:
: 【 在 fanci 的大作中提到: 】
--
FROM 203.145.95.*
9楼
|
fanci
|
2020-10-21 13:15:15
|
展开
实例指针可以,0指针不行
【 在 DoorWay () 的大作中提到: 】
: 换个实例指针可以吗?为什么? 不是把B的地址(32或64bit)解释为size_t了吗?还是用户空间的地址,肯定是个很大的数字哦。
: 直觉是与sizeof(A),sizeof(B)有关系。
: 计算的话是用仨指针转整型作差吧?
: 【 在 fanci 的大作中提到: 】
--
FROM 203.145.95.*
11楼
|
fanci
|
2020-10-21 13:28:22
|
展开
https://devblogs.microsoft.com/oldnewthing/20160224-00/?p=93081
【 在 DoorWay () 的大作中提到: 】
: 啥原理
: 【 在 fanci 的大作中提到: 】
--
FROM 203.145.95.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版