C ++ Инициализировать базовый класс const int в производном классе?

У меня есть постоянная переменная int в моем базовом классе, и я хотел бы инициализировать отвечающую переменную в моем производном классе с другим значением (принимаемым в качестве параметра), возможно ли это?

Вот что я сделал:

// 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;
};

Но, очевидно, он просит меня Base::Base() который не существует, и если я определю его, мне придется дать значение по умолчанию для m_indexчто я не хочу делать. Должен ли я определить const int m_index отдельно в каждом производном классе?

Похожий вопрос, но я не уверен, влияет ли статика на это каким-либо образом:
C ++: Инициализация постоянной статической переменной базового класса с другим значением в производном классе?

6

Решение

Просто позвоните соответствующему Base конструктор в DerivedСписок инициализации:

Derived(const int index, const std::string name) : Base(index), m_name(name) {}
15

Другие решения

Вы можете вызвать базовый конструктор так:

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;
}
};

Начиная с c ++ 11 вы можете даже использовать конструкторы одного класса. Эта функция называется делегированием конструкторов.

Derived(){}
Derived(const int index, const std::string name) : Derived() {}
1

По вопросам рекламы [email protected]