我正在阅读“ Bjarne Stroustrup 的 C++ 多重继承,发表在 1999 年 5 月号的“C/C++ 用户期刊”上。以下摘录来自相同(第 5/17 页),
4.4 铸造
显式和隐式转换还可能涉及使用 delta 修改指针值:
class A { void f(); }; class B { int f(); }; class C : A, B { }; C* pc; B* pb; pb = (B*)pc; // pb = (B*)((char*)pc+delta(B)) pb = pc; // pb = (B*)((char*)pc+delta(B)) pc = pb; // error: cast needed <-------------------- HERE pc = (C*)pb; // pc = (C*)((char*)pb-delta(B))
他向我们展示pb = pc
了无需显式转换即可完成。这绝对意味着强制转换是隐式处理的。然后,
- 为什么,当我们尝试
pc = pb
指针时,强制转换是必要的? - 指导这一点的规则是什么,在哪里?
- 它与增量值递增/递减指针有关吗?
编辑
Jonathan Mee将此问题标记为“从父母到孩子要采用哪种类型的演员? ”的副本。我害怕,我不同意。我的问题是关于为什么要施放,以及这条指导我们施放或不施放的规则在哪里。我认为背后的逻辑可能相同,但概念完全不同。在他的问题中,他对(坚持不使用动态转换)使用 dynamic_cast 和 static_cast 持怀疑态度。我的怀疑比他还差一些。