C++构造函数是否继承?

wwwo4jvm  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(153)

在C中构造函数是不继承的。然而,我在使用clang 12时发现了这个奇怪的现象。它可以用C17编译,尽管它不应该这样。如果我使用C11或C14,它不能像我预期的那样编译。

#include <iostream>

class Parent{
    int x_;
public:
    //Parent() = default;
    Parent(int const &x) : x_{x} {}
    void SayX(){ std::cout << x_ << std::endl; }
};
class Child : public Parent{
    // works with C++17 ff.
};
int main(){
    Child c {2};
    c.SayX();
    return 0;
}

--〉Outputs 2 with C17 ff.,doesn't compile with C11,14

cbeh67ev

cbeh67ev1#

你没有看到一个继承的构造函数(你是对的,这些是通过using选择的),但是聚合初始化,它确实在C++17中扩展到覆盖基类。来自cppreference(强调我的):
聚合的 * 元素 * 是:

  • [...]
  • 对于一个类,按声明顺序的直接基类,后跟按声明顺序的既不是匿名位域也不是匿名联合体成员的直接非静态数据成员。(C++17起)

所以Child c {2};2复制构造了它的Parent子对象。

相关问题