У меня есть абстрактный класс С++ без конструктора. Он должен быть базовым классом, поэтому другие классы могут наследовать его. Я пытаюсь объявить постоянную переменную в базовом классе и инициализировать ее в каждом конструкторе производного класса, но нигде в каждом из этих классов. Является ли это законным в С++? Если да, то как я могу это сделать?
Как инициализировать переменную const базового класса в конструкторе производного класса в С++?
Ответ 1
Является ли он законным в С++?
Нет. Константа должна инициализироваться в конструкторе базового класса.
Решение заключается в предоставлении соответствующего конструктора в вашем базовом классе, иначе его нельзя использовать. Кроме того, нет причин не предоставлять этот конструктор.
class Base {
int const constant;
public:
virtual ~Base() = 0; // Makes this an abstract base class.
protected:
Base(int c) : constant(c) { }
};
// Must be implemented!
Base::~Base() { }
class Derived : public Base {
public:
Derived() : Base(42) { }
};
Ответ 2
Если вам вообще нужно это сделать:
struct Base {
Base( std::string const & someValue )
: const_value( someValue ) {
}
protected:
std::string const const_value;
};
struct Derived : Base {
Derived()
: Base("Derived"){
}
};
Причиной этого является то, что вам разрешено присваивать значения значения const во время инициализации. После инициализации базы данных вам больше не разрешается изменять значение. Поэтому вы должны сделать это так, как показано выше.
Ответ 3
Почему бы вам не создать защищенный конструктор в абстрактном базовом классе и установить там постоянное значение?