作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
struct B { int i; };
struct D1 : virtual B {};
struct D2 : B {}; // <-- not virtual
struct DD : D1, D2 {};
上面的代码,编译器仍然要求 D2
也是 virtual
:
DD d;
d.i = 0; // error: request for member `i' is ambiguous
我不明白的是,一旦您提示编译器 B
相对于 DD
是 virtual
(通过 D1
) 那么为什么 i
仍然是模棱两可的?
(如果我没记错的话,较旧的 VC++(2006 年)足以通过单个 virtual
继承来解决这个问题)
最佳答案
B 对于 DD 不是虚拟的 - 它对于 D1 是虚拟的。在创建 D2 时,它包含 B 的完整拷贝。所以现在 DD 有 B 的两种实现:一种作为 D2 的一部分,另一种在末尾(由 D1 指向)。并且有两个 i
拷贝,使用它确实是模棱两可的。
如果 D2 也使用虚拟继承,而不是包含 B 的拷贝,它会包含一个指向 D1 也指向的 B 实例的指针,而 DD 将只包含 B 的一个实例。
我将尝试说明内存布局,希望结果正确...:
你的情况,有一个虚拟继承和一个非虚拟 -
| D1 | D2 + B | B |
+--+-------+----------+---------+
| vptr to B ^
+-----------------------|
同时让 D1 和 D2 虚拟继承 -
| D1 | D2 | B |
+--+-----+---+----+-------+
| | ^
+---------+---------|
关于c++ - 为什么单一虚拟继承不足以解决可怕的菱形继承(钻石问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6620497/
我们在 session 中存储两个对象。不知何故,来自另一个用户的对象之一被加载到另一个用户的 session 中。用户应该无权访问此特定数据,一旦他们看到它,他们就知道出了什么问题。 我们有向他提供
我现在正在使用 Firefox 5 检查我的网站,我发现字体的呈现很糟糕。 这就是 Firefox (5) 和 Chrome 之间的区别:例如,看看文本 Jeffe 是如何呈现的... 默认字体系列是
我是一名优秀的程序员,十分优秀!