问题标签 [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.

0 投票
2 回答
1386 浏览

c++ - 继承构造函数和虚拟基类

我即将创建一个异常类层次结构,它在概念上看起来有点像这样:

所有构造函数都应该与类的构造函数看起来相同ExceptionBase。派生的异常仅在类型上有所不同,否则没有附加功能。上面代码中提到的最后一个异常类型也应该有这些构造函数。这可能使用 C++11 标准的继承构造函数功能吗?如果这是不可能的:有什么替代方案?

(顺便说一句:在上面的代码中,类OperationFailureFileDoesNotExistError没有使用 gcc 4.8 编译,而是使用 clang 3.4。显然,gcc 拒绝继承虚拟基的构造函数。知道谁在这里会很有趣。两个编译器都拒绝了这个类OperationFailedBecauseFileDoesNotExistError,因为继承构造函数不是从直接基类继承的。)

0 投票
1 回答
2280 浏览

c++ - C++11 继承构造函数和访问修饰符

假设以下布局:

我应该可以在这里将Derived's 的构造函数指定为 public 吗?VC++ 给出以下错误:

无法访问在类 'Derived' 中声明的受保护成员
编译器在此处生成了 'Derived::Derived' [指向 using Base::Base 行]
请参阅'Derived' 的声明

即它忽略了继承构造函数上方的访问修饰符。

这是功能的限制吗?类拥有公共构造函数没有任何意义Base,因为它永远不能直接实例化(由于纯虚方法)。

0 投票
1 回答
593 浏览

c++ - boost::multiprecision::mpz_int 的构造函数继承失败

我试图创建一个派生自boost::multiprecision::mpz_int并让它继承基类构造函数的类:

g++ 4.9.0 给了我以下错误

事实是,我不知道为什么会这样。以下解决方法可以实现我想要做的事情:

谁能解释为什么第一个示例会产生错误?我认为继承基类构造函数并将值转发给它们做了大致相同的事情。我想我错了,但我仍然想知道其中的区别。

编辑:我会把事情说清楚。我根本不在乎是否有更好的方法来实现这一点(有很多)。我唯一问的是为什么在这种情况下构造函数继承失败。是由于编译器错误还是标准中某处的一些晦涩规则?

0 投票
1 回答
195 浏览

c++ - 非默认构造函数类型的继承构造函数 + 类内初始化失败

我在我的项目中遇到以下错误:

这是我正在使用的代码:

有谁知道为什么会这样?


显然,该语言愿意在继承的构造函数的末尾附加更多初始化(因为它愿意调用默认构造函数)。显然,它愿意在显式定义的构造函数的末尾隐式添加对非默认构造函数(类内初始化)的调用。但是由于某种我不明白的原因,它不愿意同时做这两个。

根据这个问题,完美转发还不够完美,不应该在这里使用。

注意:在实际情况下,构造函数B要复杂得多并且可能会发生变化,因此手动转发东西并不是一个真正可行的选择。

0 投票
2 回答
1528 浏览

c++ - C++ 在继承构造函数中使用带有类型名的声明

在阅读这个问题时,我发现了一个奇怪的点:

因为typenameBaseclass<T>::Baseclass应该注入类名,而不是构造函数。据我所知,情况与此相同:

为了确保,我写了一个测试代码。

但是,它在 gcc 4.8.3 上运行。

它也可以在没有typename.

为什么我会得到这些结果?我错过了什么?

0 投票
1 回答
307 浏览

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++ 在竞争中再次失败的地方?或者我在标准中遇到了一些灰色区域因此未定义的行为?

0 投票
3 回答
177 浏览

c++ - 继承构造函数与转发

C++11 允许继承构造函数,从而可以避免大量样板文件,尤其是像包装类这样的东西。但是,您似乎已经可以仅使用可变参数模板来实现此功能。

使用继承构造函数:

使用可变参数模板并转发:

虽然一致性(以相同的方式对待构造函数和方法using)和易用性是将继承的构造函数引入语言的非常好的理由,但还有其他原因可以说明第一个解决方案优于第二个解决方案吗?我发现讨论继承构造函数的 CWG 文档(N1890N1898)都只需注意以下内容并继续:

只不过是一次历史事故阻止了使用 this 来为构造函数和普通成员函数工作。如果构造函数被称为“ctor”或“constructor”而不是由它们的类的名称来引用,这将是可行的。我们建议将此作为继承构造函数的机制。

0 投票
2 回答
139 浏览

c++ - 继承的构造函数的定义(主体)是什么样的?

从我阅读关于 SO 和cppreference 链接的答案

继承的构造函数等效于用户定义的构造函数,其主体为空,成员初始化列表由单个嵌套名称说明符组成,它将所有参数转发给基类构造函数。

我得出的结论是,下面的类D应该E表现得一致。

E e = foo()正确地无法编译,因为B的构造函数只接受string&&. 但是,D d = foo()通过罚款。这是为什么?使用的编译器是clang3.5。

编辑:另外,正如在这个答案中所解释的,完美的转发习语不能替代继承构造函数。那么,身体究竟是什么样子的呢?

0 投票
1 回答
80 浏览

c++ - 继承构造函数并提供新的重载:无参数基构造函数似乎不参与重载决议

测试显示了一个奇怪的行为(c++14, g++ 4.9.1, clang 3.5.5):

把它们加起来:

  • 如果B没有提供它可以使用的其他构造函数A::A()
  • ifB提供了它不能使用的其他构造函数A::A(),但它使用了A::A(whatever arguments),这是出乎意料的行为(至少对我而言)。

设置 1:

设置 2:

设置 3:


为什么会发生这种情况以及如何“修复”它。

0 投票
2 回答
173 浏览

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).