Problématique

class Base {
public:
    Base(const char *str) : _str{str} {}

private:
    const char *_str;
};

class Child : public Base {
public:
    Child() {}
};

int main(void)
{
    Child instance;
}

Si vous héritez d’une classe dont la construction ne peut que se faire avec un argument et que vous essayez de faire ceci, vous allez avoir une erreur de compilation :

$ g++ main.cpp -Wall -Wextra
main.cpp: In constructor ‘Child::Child()’:
main.cpp:11:13: error: no matching function for call to ‘Base::Base()’
   11 |     Child() {}
      |             ^
main.cpp:3:5: note: candidate: ‘Base::Base(const char*)’
    3 |     Base(const char *str) : _str{str} {}
      |     ^~~~
main.cpp:3:5: note:   candidate expects 1 argument, 0 provided
main.cpp:1:7: note: candidate: ‘constexpr Base::Base(const Base&)’
    1 | class Base {
      |       ^~~~
main.cpp:1:7: note:   candidate expects 1 argument, 0 provided
main.cpp:1:7: note: candidate: ‘constexpr Base::Base(Base&&)’
main.cpp:1:7: note:   candidate expects 1 argument, 0 provided

La raison de cette erreur, c’est que pour instancier votre classe enfant correctement, il faut qu’elle même puisse instancier son parent correctement.

Solution

class Base {
public:
    Base(const char *str) : _str{str} {}

private:
    const char *_str;
};

class Child : public Base {
public:
-     Child() {}
+     Child() : Base("hello from the child") {}
};

int main(void)
{
    Child instance;
}