У меня есть чисто виртуальный класс, определенный следующим образом:
class BaseClass {
protected:
const int var;
public:
void somefun() = 0; // what I mean by a purely virtual class
// stuff...
};
Если я не добавлю конструктор, определенный как такой:
BaseClass(const int & VAR) : var(VAR) {};
, который я должен был бы впоследствии использоватьв любом производном классе мой производный класс не может инициализировать переменную const var в зависимости от того, какое значение он хочет.Теперь я действительно понимаю, что здесь происходит.Перед созданием производного класса вызывается конструктор базового класса, после чего переменные-члены const должны быть инициализированы.Мой вопрос не типа «как заставить мой код работать», это уже сделано.Мой вопрос о том, почему компилятор считает это необходимым.Для чисто виртуального класса, мне не разрешено писать что-то вроде:
class DerivedClass : BaseClass {
public:
DerivedClass() : var(SOME_VALUE) {};
}
Если компилятор знает, что за вызовом конструктора BaseClass обязательно последует вызов какого-либо производного класса constructror (поскольку объект абстрактного типа никогда не может быть создан) не должен ли он дать нам немного больше свободы?
Является ли все это следствием того, как C ++ решает проблему Diamond?Даже если бы это было так, не должен ли компилятор хотя бы каким-то образом учесть возможность определения переменной-члена const чисто виртуальных функций в производных классах?Это слишком сложно или это путает с C ++ решением проблемы Diamond?
Спасибо за помощь всем.