Héritage et arguments de construction
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;
}