c++ - 何时以及如何决定是否使用 Actor 阵容?

标签 c++ pointers casting language-design language-concepts

我正在浏览“Multiple Inheritance for C++ by Bjarne Stroustrup, Published in the May 1999 issue of "The C/C++ Users Journal"”。以下摘录自同一页(第 5/17 页),

4.4 Casting

Explicit and implicit casting may also involve modifying a pointer value with a 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 可以在不显式转换的情况下完成。这绝对意味着转换是隐式处理的。然后,

  1. 为什么当我们尝试 pc = pb 指针时,强制转换是必要的?
  2. 指导这一点的规则是什么,在哪里?
  3. 是否与增量值递增/递减指针有关?

编辑

Jonathan Mee将此问题标记为“What Type of Cast to Go from Parent to Child?”的拷贝。恐怕,我不同意。我的问题是,为什么要强制转换,这条指导我们强制转换或不强制转换的规则在哪里。我认为背后的逻辑可能相同,但概念完全不同。在他的问题中,他怀疑(坚持不使用动态转换)使用dynamic_cast和static_cast。我的怀疑比他的怀疑还要晚一些。

最佳答案

它与我们知道对象具有的类型有关。每个 C 也是一个 B,因此转换始终有效(隐式)。

每个 B 都不是 C 的一部分,因此您必须告诉编译器您确定该特定转换会起作用。这就是显式转换的使用。

关于c++ - 何时以及如何决定是否使用 Actor 阵容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38351375/

相关文章:

C++ 隐式函数调用

c++ - 如何限制 GLFW 窗口中的每秒帧数? (使用亲爱的 ImGui)

C++ for each 有一个指针

c++ - 将指向派生类的指针强制转换为指向指向基类的指针的引用

c++ - 类型转换为整数

c++ - 使用 ShellExecute 打开不带 ".exe"扩展名的可执行文件

c++ - 如何编写具有超过 2 层继承的奇怪重复模板?

c - 在 C 中传递一个数组数组

c - 如何使用 char* 作为 char[]

mysql - 在 MySQL 中,如何将 JSON_OBJECT 中的 VARCHAR 转换为 UNSIGNED?