У меня есть базовый класс:
class CBase {
public:
virtual void SomeChecks() {}
CBase() {
/* Do some checks */
SomeChecks();
/* Do some more checks */
}
};
и производный класс:
class CDerived : public CBase {
public:
virtual void SomeChecks() { /* Do some other checks */ }
CDerived() : CBase() {}
};
Эта конструкция кажется немного странной, но в моем случае это необходимо, потому что CBase выполняет некоторые проверки, а CDerived может смешивать некоторые проверки между ними. Вы можете видеть это как способ «зацепить» функции в конструкторе.
Проблема этой конструкции заключается в том, что при создании CDerived сначала создается CBase, и отсутствует информация о CDerived (поэтому перегруженная функция SomeChecks () не вызывается).
Я мог бы сделать что-то вроде этого:
class CBase {
public:
void Init() {
/* Do some checks */
SomeChecks();
/* Do some more checks */
}
virtual void SomeChecks() {}
CBase(bool bDoInit=true) {
if (bDoInit) { Init(); }
}
};
class CDerived : public CBase {
public:
virtual void SomeChecks() { /* Do some other checks */ }
CDerived() : CBase(false) { Init() }
};
Это не совсем безопасно, потому что я хочу, чтобы конструктор с параметром false был защищен, поэтому вызывать его могут только производные классы.
Но тогда мне придется создать второй конструктор (который защищен) и заставить его принимать другие параметры (возможно, неиспользуемые, потому что конструктор вызывается, когда не нужно вызывать Init ()).
Так что я застрял здесь.
EDIT
На самом деле я хочу что-то вроде этого:
class CBase {
protected:
void Init() { /* Implementation of Init ... */ }
CBase() { /* Don't do the Init(), it is called by derived class */ }
public:
CBase() { Init(); } // Called when an object of CBase is created
};
class CDerived : public CBase {
public:
CDerived() : CBase() { Init(); }
};
Мне кажется, невозможно, чтобы два конструктора с одинаковыми аргументами были защищены и общедоступны?