Да, при создании экземпляра дочернего класса сначала вызывается конструктор родительского класса, этого не избежать. (извините, отвечаю без ссылок на стандарт)
Возможно, стоит наследовать оба класса от более абстрактного базового класса, содержащего общие для обоих методы? Если существование объектов базового класса хотите запретить (например, потому что без конструктора в дочерних классах такие объекты никому не нужны), можете сделать его конструктор
protected:. Тогда дочерние классы будут иметь право на создание объекта (и вызов конструктора) как часть себя, а все остальные - нет.
Альтернативное решение: родительскому классу добавить специальный конструктор, который вычислений не делает, а в дочернем классе явно вызывать именно его:
struct no_calculations_tag{};
class Parent {
public:
Parent() { /* many calculations */ }
protected:
Parent(const no_calculations_tag &) {}
public: // other methods
};
class Child : public Parent {
public:
Child() : Parent(no_calculations_tag()) { /* child-specific calculations */ }
// other methods
};