#include<iostream>
using namespace std;
class base
{
protected:
int a;
public:
base(int i)
{
a=i;
}
};
class derived :protected base
{
public:
derived(){}
void show()
{
cout<<a;
}
};
int main()
{
base obj(2);
derived obj1;
obj1.show();
return 0;
}
Why is this program giving error as In constructor derived::derived():
error: no matching function for call to
base::base()
Please explain. As i have read in stackoverflow that in case of inheriting as protected, protected members of base class became protected member of derived class. If I am wrong then please share a good link to clear my misconception
Once you define a constructor for any class, the compiler does not generate the default constructor for that class.
You define the parameterized constructor(
base(int i)) forbaseand hence the compiler does not generate the no argument constructor forbase.Resolution:
You will need to define a constructor taking no arguments for
baseyourself.Add this to your
baseclass:EDIT:
The answer to both is NO.
The purpose of constructors in C++ is to initialize the member variables of the class inside the constructor. As you understand the compiler generates the default constructor(constructor which takes no arguments) for every class.
But there is a catch, If you yourself define (any)constructor(one with parameters or without) for your class, the compiler does not generate the default constructor for that anymore. The compiler reasoning here is “Huh, this user writes a constrcutor for his class himself, so probably he needs to do something special in the constructor which I cannot do or understand”, armed with this reasoning the compiler just does not generate the default no argument constructor anymore.
Your code above and you assume the presence of the default no argument constructor(When
derivedclass object is created). But since you already defined one constructor for yourbaseclass the compiler has applied its reasoning and now it refuses to generate any default argument constructor for yourbaseclass. Thus the absence of the no argument constructor in thebaseclass results in the compiler error.