Я думаю, что «проблема» в строке:
stack1 st1;
stack2 st2;
Это вызовет конструктор по умолчанию и установит значение переменных top1
и top2
как ноль. Обходной путь к этому должен состоять в том, чтобы инициализировать эти переменные с некоторым положительным ненулевым значением.
Следовательно, код будет выглядеть примерно так (фокусируясь только на измененных частях):
class stack1 {
private:
int num1[SIZE/2]; int top1;
public:
.....
stack1()
{
top1 = 0; num1[SIZE/2] = {0};
}
stack1(int top1)
{this.top1 = top1;}
};
class stack2 {
private:
int num2[SIZE/2]; int top2; public:
public:
.....
stack2()
{
top2 = 0; num2[SIZE/2] = {0};
}
stack2(int top2)
{this.top2 = top2;}
};
class operation: public stack2, public stack1 {
.....
public:
int c;
int oper(void)
{
.....
//just an example, can be declared explicitly as well
stack1 st1(5);
stack2 st2(7);
.....
Также Я бы посоветовал вам сделать ваш код немного более читабельным (например, наличие 3-строчного {}
в if
случаях, охватывающих только одну строку). Это просто ненужное потребление пространства.
И, наконец, если «переопределение» переменных родительского класса означает, что переменные, повторно присваивающие какое-либо значение при наследовании, они не будут делать, если вы не укажете явно (например, как использование конструктора в нашем случае для присвоения различных значений top1
и top2
). Унаследованный класс получит копию состояния родительского класса *.
*, что означает, что они не могут быть изменены напрямую унаследованным классом. Например, если бы вы сделали: int top1=5;
изначально, тогда top1
было бы 5, пока его не где-то снова не переопределить (например, с помощью конструктора)