问题标签 [inheriting-constructors]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 继承构造函数和虚拟基类
我即将创建一个异常类层次结构,它在概念上看起来有点像这样:
所有构造函数都应该与类的构造函数看起来相同ExceptionBase
。派生的异常仅在类型上有所不同,否则没有附加功能。上面代码中提到的最后一个异常类型也应该有这些构造函数。这可能使用 C++11 标准的继承构造函数功能吗?如果这是不可能的:有什么替代方案?
(顺便说一句:在上面的代码中,类OperationFailure
并FileDoesNotExistError
没有使用 gcc 4.8 编译,而是使用 clang 3.4。显然,gcc 拒绝继承虚拟基的构造函数。知道谁在这里会很有趣。两个编译器都拒绝了这个类OperationFailedBecauseFileDoesNotExistError
,因为继承构造函数不是从直接基类继承的。)
c++ - C++11 继承构造函数和访问修饰符
假设以下布局:
我应该可以在这里将Derived
's 的构造函数指定为 public 吗?VC++ 给出以下错误:
无法访问在类 'Derived' 中声明的受保护成员
编译器在此处生成了 'Derived::Derived' [指向 using Base::Base 行]
请参阅'Derived' 的声明
即它忽略了继承构造函数上方的访问修饰符。
这是功能的限制吗?类拥有公共构造函数没有任何意义Base
,因为它永远不能直接实例化(由于纯虚方法)。
c++ - boost::multiprecision::mpz_int 的构造函数继承失败
我试图创建一个派生自boost::multiprecision::mpz_int
并让它继承基类构造函数的类:
g++ 4.9.0 给了我以下错误:
事实是,我不知道为什么会这样。以下解决方法可以实现我想要做的事情:
谁能解释为什么第一个示例会产生错误?我认为继承基类构造函数并将值转发给它们做了大致相同的事情。我想我错了,但我仍然想知道其中的区别。
编辑:我会把事情说清楚。我根本不在乎是否有更好的方法来实现这一点(有很多)。我唯一问的是为什么在这种情况下构造函数继承失败。是由于编译器错误还是标准中某处的一些晦涩规则?
c++ - 非默认构造函数类型的继承构造函数 + 类内初始化失败
我在我的项目中遇到以下错误:
这是我正在使用的代码:
有谁知道为什么会这样?
显然,该语言愿意在继承的构造函数的末尾附加更多初始化(因为它愿意调用默认构造函数)。显然,它愿意在显式定义的构造函数的末尾隐式添加对非默认构造函数(类内初始化)的调用。但是由于某种我不明白的原因,它不愿意同时做这两个。
根据这个问题,完美转发还不够完美,不应该在这里使用。
注意:在实际情况下,构造函数B
要复杂得多并且可能会发生变化,因此手动转发东西并不是一个真正可行的选择。
c++ - Visual C++ 14 CTP3:c++11 继承构造函数错误?
以下代码片段在 Clang 3.4/3.5 (Xcode 5/6) 下构建得非常好,但在 Visual C++ 14 CTP3 下抛出错误:
1>----- 构建开始:项目:InheritingConstructor,配置:
调试 Win32 ------ 1>inheritingconstructor.cpp(60):错误 C2661:
'D::D':没有重载函数需要 2 个参数
========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========
通过尝试从基类继承模板构造函数,代码确实给编译器带来了一些压力,也许这就是 Visual C++ 在竞争中再次失败的地方?或者我在标准中遇到了一些灰色区域因此未定义的行为?
c++ - 继承构造函数与转发
C++11 允许继承构造函数,从而可以避免大量样板文件,尤其是像包装类这样的东西。但是,您似乎已经可以仅使用可变参数模板来实现此功能。
使用继承构造函数:
使用可变参数模板并转发:
虽然一致性(以相同的方式对待构造函数和方法using
)和易用性是将继承的构造函数引入语言的非常好的理由,但还有其他原因可以说明第一个解决方案优于第二个解决方案吗?我发现讨论继承构造函数的 CWG 文档(N1890和N1898)都只需注意以下内容并继续:
只不过是一次历史事故阻止了使用 this 来为构造函数和普通成员函数工作。如果构造函数被称为“ctor”或“constructor”而不是由它们的类的名称来引用,这将是可行的。我们建议将此作为继承构造函数的机制。
c++ - 继承的构造函数的定义(主体)是什么样的?
从我阅读关于 SO 和cppreference 链接的答案
继承的构造函数等效于用户定义的构造函数,其主体为空,成员初始化列表由单个嵌套名称说明符组成,它将所有参数转发给基类构造函数。
我得出的结论是,下面的类D
应该E
表现得一致。
E e = foo()
正确地无法编译,因为B
的构造函数只接受string&&
. 但是,D d = foo()
通过罚款。这是为什么?使用的编译器是clang3.5。
编辑:另外,正如在这个答案中所解释的,完美的转发习语不能替代继承构造函数。那么,身体究竟是什么样子的呢?
c++ - 继承构造函数并提供新的重载:无参数基构造函数似乎不参与重载决议
测试显示了一个奇怪的行为(c++14
, g++ 4.9.1
, clang 3.5.5
):
把它们加起来:
- 如果
B
没有提供它可以使用的其他构造函数A::A()
- if
B
提供了它不能使用的其他构造函数A::A()
,但它使用了A::A(whatever arguments)
,这是出乎意料的行为(至少对我而言)。
设置 1:
设置 2:
设置 3:
为什么会发生这种情况以及如何“修复”它。
c++ - Inheriting constructors work only partially
I have following class, written so, as to work completely, whatever the typedef is:
I wanted to make a subclass, that is actually almost the same, apart from overloaded typedef:
What I wanted to achieve was to make a class B, that is: - identical to A - has all of As functions (there are few member functions in A, that I've not written) - has all of As operators - has all of As constructors - has different typedef - has the same destructor
My code does not work, because I can't call B(void*, uint32, uint32, size_t), which is what I want. (Intellisense shows me only B() and B(const B&) as available constructors).