8

I have a constant int variable in my base class, and I would like to initialize responding one in my derived class, with different value (taken as a parameter), is this possible?

Here's what I did:

// Base.h (methods implemented in Base.cpp in the actual code)
class Base {
    public:
        Base(const int index) : m_index(index) {}
        int getIndex() const { return m_index; }
    private:
        const int m_index;
};

// Derived.h
class Derived : public Base {
    public:
        Derived(const int index, const std::string name) : m_name(name) {}
        void setName(const std::string name) { m_name = name; }
        std::string getName() const { return m_name; }
    private:
        std::string m_name;
};

But obviously it's asking me for Base::Base() which doesn't exist, and if I define it, I will have to give default value for m_index, which I don't want to do. Do I have to define const int m_index separately in every derived class?

Similiar question, but I'm not sure if the static affects this in any way: C++ : Initializing base class constant static variable with different value in derived class?

Community
  • 1
  • 1

2 Answers2

20

Simply call the appropriate Base constructor in the Derived's initialization list:

Derived(const int index, const std::string name) : Base(index), m_name(name) {}
NPE
  • 486,780
  • 108
  • 951
  • 1,012
  • 2
    WHAT?!? I've been doing C++ for like 3 to 4 years or something, and I've never ran into this? I've always thought I have to use the default constructor... Thanks dude, gonna accept in a minute. –  Nov 27 '12 at 19:52
2

You can call the base constructor like this:

class B1 {
  int b;
public:    
  // inline constructor
  B1(int i) : b(i) {}
};

class B2 {
  int b;
protected:
  B2() {}    
  // noninline constructor
  B2(int i);
};

class D : public B1, public B2 {
  int d1, d2;
public:
  D(int i, int j) : B1(i+1), B2(), d1(i)
  {
    d2 = j;
  }
};

Since c++11 your can even use constructors of the same class. The feature is called delegating constructors.

Derived(){}
Derived(const int index, const std::string name) : Derived() {}
ManuelSchneid3r
  • 15,850
  • 12
  • 65
  • 103