- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我将以下称为“多重再继承”:
我想知道它是否存在以及如何明确地访问嵌入的子对象。
1.) [Professional C++, 2nd ed.]† 指出可编译程序不能有直接继承的类它的直接父级和所述父级的父类。是真的吗?
给定一个 GrandParent
和 Parent
, 扩展 GrandParent
, VC12 和 g++ 允许 GrandChild
直接从两个 Parent
继承和 GrandParent
.在 VC12 和 g++ 中,可以这样定义这些类:
GrandParent
声明 int num
数据成员。 Parent
声明自己的num
除了继承GrandParent
的num
. GrandChild
声明自己的num
除了继承Parent
的和 GrandParent
的num
秒。
VC12 似乎允许全面明确的成员访问,但 g++ 仅在某些情况下允许。
#include <iostream>
using std::cout;
using std::endl;
struct GrandParent { int num; };
struct Parent : GrandParent { int num; };
struct GrandChild : GrandParent, Parent { int num; };
int main()
{
GrandChild gc;
gc.num = 2;
gc.Parent::num = 1;
gc.Parent::GrandParent::num = 0; // g++ error: ‘GrandParent’ is an ambiguous base of ‘GrandChild’
gc.GrandParent::num = 5; // g++ error: ‘GrandParent’ is an ambiguous base of ‘GrandChild’
// --VC12 output; g++ output--
cout << gc.num << endl; // 2 ; 2
cout << gc.Parent::num << endl; // 1 ; 1
cout << gc.Parent::GrandParent::num << endl; // 0 ; N/A due to above error
cout << gc.GrandParent::num << endl; // 5 ; N/A due to above error
}
2.) 为什么是 (a) gc.Parent::GrandParent::num
当 (b) gc.Parent::num
在 g++ 中模棱两可不是吗? (a) 唯一地描述了它在继承树上的位置。 gc
只有1个Parent
子对象,只有 1 个 GrandParent
子对象,只有 1 个 num
.对于 (b),gc
有一个Parent
, 它有自己的 num
还有一个GrandParent
与另一个 num
的子对象.
3.) 对于 gc.GrandParent::num
,似乎 VC12 正在查看 gc
的即时GrandParent
后者的 num
的基础子对象.我猜它是明确的原因是它是由 gc
限定的名称查找。 , 所以 .
右边的实体在 gc
中首先查找的范围,最直接的 GrandParent
至gc
的作用域是直接继承的,不是通过Parent
间接继承的.我错了吗?
4.) 为什么是 gc.GrandParent::num
在 gc.Parent::num
时对 g++ 模棱两可不是吗?如果一个是模棱两可的,那么两者不应该同样模棱两可吗?对于之前,gc
有两个 GrandParent
小号;对于后者,Parent
有 2 num
秒。
†Gregoire、Marc R. 等人。 专业 C++,第 2nd 版。印第安纳波利斯:威利出版社,2011 年。 241. 打印。
最佳答案
对此的常用术语是菱形图案(或diamond problem)。
这本身并不是一个错误,但正如这里的评论中所指出的,任何尝试访问在层次结构中其他地方重复的直接基础都将导致歧义错误。
一种解决方法是使基础间接。 C++11 中新的继承构造函数特性允许完美的包装器:
template< typename base, typename tag >
struct disambiguated_base : base
{ using base::base; };
给定一个未使用的标签类型,这会生成一个新类,该类派生自给定的基类,并且在功能上与给定的基类相同。标记类型可能是由详细类型说明符表示的不完整类:
struct GrandChild : Parent,
disambiguated_base< GrandParent, class grandchild_grandparent_tag > {
typedef disambiguated_base< GrandParent, grandchild_grandparent_tag >
my_direct_grandparent;
int num;
};
现在 GrandChild
可以使用 my_direct_grandparent::
来消除成员访问的歧义。
关于c++ - 什么是多重再继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693848/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!