【发布时间】:2016-11-16 00:33:40
【问题描述】:
我正在经历“Multiple Inheritance for C++ by Bjarne Stroustrup, Published in the May 1999 issue of "The C/C++ Users Journal"”。以下摘录来自相同(第 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 将此问题标记为“What Type of Cast to Go from Parent to Child?”的副本。我害怕,我不同意。我的问题是关于,为什么要施放,这条指导我们施放或不施放的规则在哪里。我认为背后的逻辑可能相同,但概念完全不同。在他的问题中,他对(坚持不使用动态转换)使用 dynamic_cast 和 static_cast 持怀疑态度。我的怀疑比他还差一些。
【问题讨论】:
-
你会在这里有一个很好的解释:stackoverflow.com/questions/25137705/…
-
@JonathanMee - 我的问题是关于为什么要投射以及指导我们投射或不投射的规则在哪里。我认为背后的逻辑可能相同,但概念完全不同。我的怀疑与你的怀疑没有任何相似之处被标记为重复。在你的问题中,你知道你为什么要投射,但你对使用哪一个有疑问。我的怀疑仍然落后于你的一些步骤:)
标签: c++ pointers casting language-design language-concepts