При наследовании класс родителя возвращает 0

При вызову Soldier метод Soldier.FindQ() возвращает произведние weight и hight, как и нужно. Но при вызове SoldierNew (потомок) Soldier.FindQ() всегда возвращает 0, из-за чего SoldierNew.FindQ() считает непраивльно. Не понимаю в чем ошибка?!

public class Soldier
{
    private string surname;
    private int height;
    private int weigth;
    protected double q;

    public Soldier(string surname, int height, int weigth)
    {
        this.surname = surname;
        this.height = height;
        this.weigth = weigth;
        q = FindQ();
    }

    public virtual double FindQ()
    {
        return height * weigth;
    }

    public String PrintInfo()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(' ' + surname + '\n' + 
            "Рост - " + height + '\n' + 
            "Вес - " + weigth + '\n' + 
            "Q - " + FindQ() + '\n');
        return sb.ToString();
    }
public class SoldierNew : Soldier
{
    private Education p;
    public SoldierNew(string surname, int height, int weigth, Education p) : base(surname, height, 
weigth)
    {
        this.p = p;
    }

    public override double FindQ()
    {
        if (p.Equals(Education.higher))
            return 2 * q;
        if (p.Equals(Education.primary))
            return 0.5 * q;
        return q;
    }
}

Ответы (1 шт):

Автор решения: A K

Когда вы создаёте объект SoldierNew то вы входите в конструктор базового класса и в нём начинаете считать q. Только расчёт идёт вызывая FindQ из наследника, а не из базового класса.

Но там получается вот какой момент: чтобы посчитать q вам надо знать q, а его нет.

По логике вероятно вы ожидаете что-то типа:

public override double FindQ()
{
    q = base.FindQ();

    if (p.Equals(Education.higher))
        return 2 * q;
    if (p.Equals(Education.primary))
        return 0.5 * q;
    return q;
}

введите сюда описание изображения


Update: Если я правильно понял, то @tym32167 предлагает более правильный вариант:

public override double FindQ()
{
    var baseQ = base.FindQ();
    
    if (p.Equals(Education.higher))
        return 2 * baseQ;
        
    if (p.Equals(Education.primary))
        return 0.5 * baseQ;
    
    return baseQ;
}
→ Ссылка