C++ 构造函数只能直接从基继承?

C++ 构造函数只能直接从基继承?,c++,inheritance,language-lawyer,C++,Inheritance,Language Lawyer,我有一个基类a,它定义了一些构造函数 然后我有从A继承的B1、B2、B3类 这些都不是要实例化的。相反,我有从B1继承的类C11、C12、C13,等等 C11、C12等都需要A的构造函数 我认为我不能用A::A来写;例如,在C11类中,对吗 除了剪切和粘贴这些构造函数之外,获得这些构造函数的唯一方法是B1使用A::A;C11表示使用B1::B1 请注意,我的问题不是关于特定编译器支持什么,而是规范允许什么,所以只需测试它并不是这个特定问题的真正答案。如果您正在寻找该标准的引用,那么下面是: [n

我有一个基类a,它定义了一些构造函数

然后我有从A继承的B1、B2、B3类

这些都不是要实例化的。相反,我有从B1继承的类C11、C12、C13,等等

C11、C12等都需要A的构造函数

我认为我不能用A::A来写;例如,在C11类中,对吗

除了剪切和粘贴这些构造函数之外,获得这些构造函数的唯一方法是B1使用A::A;C11表示使用B1::B1


请注意,我的问题不是关于特定编译器支持什么,而是规范允许什么,所以只需测试它并不是这个特定问题的真正答案。

如果您正在寻找该标准的引用,那么下面是:

[namespace.udecl]/3。。。如果使用声明符命名构造函数,则其嵌套的名称说明符应命名所定义类的直接基类


如果您正在寻找标准中的报价,则如下所示:

[namespace.udecl]/3。。。如果使用声明符命名构造函数,则其嵌套的名称说明符应命名所定义类的直接基类


虽然C++实现中有很多差异,但差异通常是关于复杂模型模板或对象模型的晦涩方面。当它像名称作用域这样简单,或者具体类中的哪些基类名称可以在成员初始值设定项列表中使用时,可以完全合理地假设,如果编译器禁止它,那是因为标准禁止它。诚然,弗拉斯是一个反例。@Nicolas我也有相反的看法。如果编译器可以支持一些显而易见的东西,那么它通常作为一个扩展来完成,有时没有警告。C++在方法指针上不需要类说明符,虽然警告它不是标准的,这似乎有点关系,它是关于寻找成员的灵活性。这种差异通常与复杂的模板材料或对象模型的神秘方面有关。当它像名称作用域这样简单,或者具体类中的哪些基类名称可以在成员初始值设定项列表中使用时,可以完全合理地假设,如果编译器禁止它,那是因为标准禁止它。诚然,弗拉斯是一个反例。@Nicolas我也有相反的看法。如果编译器可以支持一些显而易见的东西,那么它通常作为一个扩展来完成,有时没有警告。例如,g++不需要方法指针上的类说明符,但它警告说它不是标准的。这似乎有点相关,因为它涉及到查找成员的灵活性。