多 继 承 最 大 的 问 题 是 所 谓 的“ 钻 石 结 构”。 例 如 下 面 的 代 码:
class A { ...... }; class B : public A { ...... }; class C : public A { ...... }; class D : public C,B { ...... }
---- 由 于 类D 同 时 从 类C 和 类B 继 承, 因 此 在 下 面 的 语 句 中 就 会 发 生 歧 义:
D* pD = new D; (A*)pD- >Func(...);
---- 由 于 类D 通 过 类C 和 类B 分 别 继 承 了 类A, 这 里 的 强 制 转 化 就 会 发 生 歧 义。
---- ATL 使 用 了C++ 最 新 规 范 中 加 入 的 两 个 运 算 符 号 static_cast、dynamic_cast 代 替 简 单 的 强 制 转 化, 从 而 消 除 多 继 承 带 来 的 歧 义。 使 用 这 两 个 运 算 符 号, 我 们 可 以 在 对 象 运 行 过 程 中 获 取 对 象 的 类 型 信 息。 上 面 的 代 码 可 以 采 用 下 面 的 方 式 修 改:
D* pD = new D; static_cast< A* >(static_cast< B* >(pD))- >Func(...);
cast 指令就是在当前this指针上加上一定偏移!