LogicStuff LogicStuff - 1 year ago 64
C++ Question

Inherit and overload default constructor

I've been searching for this and I'm amazed I haven't found anything. Why can't I inherit a base class constructor using

declaration and add an overload in the derived class? I'm using Visual C++ 2013, the base class constructor is ignored when default-constructing

error C2512: 'B' : no appropriate default constructor available

I've dealt with this by re-defining the constructors, but I don't like that. This is just a minimal example, it wouldn't bother me if I had only one base class constructor.

struct A
A() : a(10) {}

int a;

struct B : A
using A::A;

explicit B(int a) { this->a = a; }

int main()
B b;

Answer Source

The problem is that default-constructors are not inherited. From [class.inhctor]/p3:

For each non-template constructor in the candidate set of inherited constructors [..], a constructor is implicitly declared with the same constructor characteristics unless there is a user-declared constructor with the same signature in the complete class where the using-declaration appears or the constructor would be a default, copy, or move constructor for that class.

You also have a user-declared constructor that suppresses the creation of an implicit default-constructor. Just add a defaulted one to make it work:

B() = default;