代码之家  ›  专栏  ›  技术社区  ›  fatdragon

当我有一个虚方法时,构造函数被编译器删除了?

c++
  •  5
  • fatdragon  · 技术社区  · 4 年前

    我遇到了一个可以在下面的代码片段中总结的情况。基本上,我希望我的类继承构造函数。它可以工作,但一旦在中定义了虚拟方法,编译就会失败 C

    1. 我可以在B和C中定义构造函数,并最终委托给A的构造函数。有没有更好的办法?
    #include <iostream>
    
    struct A {
      A() = delete;
      A(int x) : x_(x) {}
      int x_;
    };
    
    struct B : public A {
    };
    
    struct C : public B {
      // What? defining virtual method kills the inherited constructor
      //virtual void foo() {}
    };
    
    int main() {
      C c{10};
      std::cout << "Hello World: " << c.x_ << std::endl;
    }
    
    1 回复  |  直到 4 年前
        1
  •  9
  •   Brian Bi    4 年前

    只有显式声明继承的构造函数时,才会继承构造函数。具体做法如下:

    struct B : public A {
        using A::A;
    };
    
    struct C : public B {
        using B::B;
    };
    

    C 不再是聚合,因此无法使用聚合初始化。如果声明继承的构造函数,则可以构造 C级 无需使用聚合初始化。