Вместо того, чтобы заставлять их вызывать функцию (которую вы в любом случае не можете гарантировать), заставьте конструктор базового класса ожидать параметр, который включает в себя поведение, которое вам необходимо.
Таким образом, базовый класс является автономным и имеет всю необходимую информацию к моменту запуска его конструктора.
Например, если вы думаете о чем-то вроде этого:
class Base
{
public:
Base()
{
reset();
}
protected:
virtual void reset() = 0;
void setValue(int value);
};
class Derived : public Base
{
public:
void reset() override
{
setValue(20);
}
};
Вы можете сделать это вместо:
class Base
{
public:
explicit Base(int value)
{
setValue(value);
}
private: // can be private
void setValue(int value);
};
class Derived : public Base
{
public:
Derived()
: Base(20)
{
}
};