![]() |
1
14
根据 C++ Core Issue #7 无法从派生具有虚拟专用基的类。这是编译器中的错误。 |
![]() |
2
6
对于第二个问题,这可能是因为你没有让它含蓄地 定义 . 如果构造函数只是隐式声明的,则没有错误。例子:
对于第一个问题,这取决于编译器使用的名称。我不知道该标准指定了什么,但是这个代码是正确的,因为外部类名(而不是继承的类名)是可访问的:
也许这个标准在这一点上还没有明确规定。我们得看看。
代码似乎没有任何问题。此外,有迹象表明代码是有效的。(虚拟)基类子对象是默认初始化的-没有任何文本表明类名的名称查找在
C++ 03有类似的文本(你不太清楚的文本-它只是说它的默认构造函数在一个地方被调用,而在另一个地方,它使它依赖于该类是否是一个POD)。为了让编译器默认地初始化子对象,它只需要调用它的默认构造函数-不需要首先查找基类的名称(它 已经知道 考虑什么基础)。
考虑一下这个代码,它当然是有效的,但是如果这个
将
完成(参见
如果编译器的默认构造函数只是查找类名
对于构造函数,请注意
这可以用两种方式解释:
在我看来,这里的标准不太明确。第二种方法将使其有效(通过
然后,我们将直接找到虚拟基“类名作为公共名,因为我们不需要遍历派生类”的作用域,并将该名称作为不可访问的名称。同样,其推理是相似的。考虑:
如果析构函数只调用
|
![]() |
3
2
虚拟基类总是从最派生的类(这里是C)初始化的。编译器必须检查构造函数是否可访问(即,对于
虽然您的描述暗示没有),但事实上,作为基础,a是私有的或不重要(颠覆将很容易:
从最派生的类调用虚拟基类构造函数的原因是,在任何将其作为基类的类之前,都需要先构造它。 编辑:基里尔提到了一个旧的核心问题,这与我的阅读和最近编译器的行为很奇怪。我将尝试以某种方式获取标准引用,但这可能需要时间。 |
![]() |
M. Koch · API和应用层之间的合同应该放在哪个层/项目中? 2 年前 |
![]() |
overexchange · 客户端锁定是否违反了同步策略的封装? 7 年前 |
|
mangochaser · java——具有多态性和封装的几何形状 8 年前 |
![]() |
LBaelish · 安全/正确使用指针[关闭] 9 年前 |
![]() |
Petr Marek · Javascript类封装行为 9 年前 |