I have the following C++ code:
#include <iostream>
#include <string>
using namespace std;
class Surface
{
public:
virtual void draw();
protected:
int x,y;
};
class Control: public Surface
{
public:
Control(): x(10), y(10), name("control") { cout << "Control constructor" << endl; }
void draw() {}
protected:
string name;
};
class Label: public Control
{
public:
Label(): x(10), y(10), name("label"), text("label") { cout << "Label constructor" << endl; }
void draw() { cout << "drawing a label" << endl; }
protected:
string text;
};
int main(int argc, const char *argv[])
{
Label l;
return 0;
}
When trying to compile, i get the following errors:
$ g++ main.cpp
main.cpp: In constructor 'Control::Control()':
main.cpp:16:16: error: class 'Control' does not have any field named 'x'
main.cpp:16:23: error: class 'Control' does not have any field named 'y'
main.cpp: In constructor 'Label::Label()':
main.cpp:25:14: error: class 'Label' does not have any field named 'x'
main.cpp:25:21: error: class 'Label' does not have any field named 'y'
main.cpp:25:28: error: class 'Label' does not have any field named 'name'
I don’t understand why aren’t Control and Label inheriting Surfaces properties ?
The inherited members cannot appear in the member-initialization-list. Just think, how can they appear in the derived class’s member-initialization-list, because by the time it will be executed, they (i.e base class members) are already created (recall that base subobject gets created before the derived class constructor and member-initialization-list).
If it was allowed, then that would mean the base class members would be allowed to be initialized more than once, which doesn’t make sense. In C++, objects don’t get initialized1 more than once. Initialization happens only once; assignment can happen many times.
The proper way to write that code is to parameterize the base class constructor, and pass values of
xandyas argument to the base class constructor.1. I mean dynamic initialization happens only once. However, an object can be initialized twice : once at compile time called static initialization, then other at runtime called dynamic initialization. For more, see this : What is dynamic initialization of object in c++?