О наследовании в С++

92
09 ноября 2021, 11:30

Задание от преподавателя ООП в вузе. Вычислить сумму чисел наследуемых классов используя методы доступа. И такая схема. Как я понимаю, наследуется структура класса, а не значения переменных в его объектах и т.д. Это вообще возможно?

#include <iostream>
using namespace std;
class B1 {
  int a;
};
class B2 {
  int b;
};
class D1 : protected B1 {
  int c;
};
class D2 : public B1 {
  int d;
};
class D3 : protected D2, protected B2 {
  int e;
};
class D4 : public D1, public D3{
  int f;
};
int main() {
  return 0;
}
Answer 1

Может как-то так?

class A {
    int a;
public:
    A(int val) : a(val) {}
    virtual ~A() {}
    virtual int getSum() {
        return a;
    }
};
class B {
    int b;
public:
    B(int val) : b(val) {}
    virtual ~B() {}
    virtual int getSum() {
        return b;
    }
};
class C : protected A, public B {
    int c;
public:
    C(int val1, int val2, int val3) : A(val1), B(val2), c(val3) {}
    virtual int getSum() override {
        return A::getSum() + B::getSum() + c;
    }
};
int main() {
    cout << C(1, 2, 3).getSum() << endl;
    return 0;
}

А когда А и Б унаследованны от одного базового класса? у вас наверное 2 раза вернется от него значение? а если будет еще С унаследованный от него же ? будет уже 3, можно конечно, статическое поле с флагом возврата пришить, но это такое....

Хороший вопрос! Это так называемое diamond наследование. Для данного случая в C++ существует виртуальное наследование. С ним в классе C не будет дублирование полей Base из классов A и B, но придётся инициализировать поле Base класса уже в классе C, ну и переиспользовать getSum из родительских классов уже не получится (по крайней мере я не очень представляю как это можно сделать)

class Base {
protected:
    int base;
public:
    Base(int val) : base(val) {}
    virtual ~Base() {}
    virtual int getSum() {
        return base;
    }
};
class A : virtual protected Base {
protected:
    int a;
public:
    A(int val) :Base(500), a(val) {}
    virtual ~A() {}
    virtual int getSum() override {
        return a + base;
    }
};
class B : virtual protected Base {
protected:
    int b;
public:
    B(int val) : Base(1000), b(val) {}
    virtual ~B() {}
    virtual int getSum() override {
        return b + base;
    }
};
class C : protected A, protected B {
protected:
    int c;
public:
    C(int val1, int val2, int val3) : Base(100), A(val1), B(val2), c(val3) {}
    virtual int getSum() override {
        return base + a + b + c;
    }
};
int main() {
    cout << C(1, 2, 3).getSum() << endl;
    return 0;
}
Answer 2

Странно, но это работает. Пришлось использовать виртуальное наследование.

#include <iostream>
using namespace std;
class B1 {
  public:
  int b1;
  B1() {
    b1=4;
  }
};
class B2 {
  public:
  int b2;
  B2() {
    b2=6;
  }
};
class D1 : virtual protected B1 {
  public:
  int d1;
  D1() {
    d1=3;
  }
};
class D2 : virtual public B1 {
  public:
  int d2;
  D2() {
    d2=1;
  }
};
class D3 : protected D2, protected B2 {
  public:
  int d3;
  D3() {
    d3=6;
  }
};
class D4 : public D1, public D3{
  public:
  int d4;
  D4() {
    d4=5;
  }
  void add() {
    cout<<"Suma: "<<b1+b2+d1+d2+d3+d4<<endl;
  }
};
int main() {
  B1 b1;
  B2 b2;
  D1 d1;
  D2 d2;
  D3 d3;
  D4 d4;
  d4.add(); //Outputs 25
  return 0;
}
READ ALSO
Перенаправление вывода консоли в файл

Перенаправление вывода консоли в файл

Как перенаправить вывод cmd в файл

346
Почему не корректно срабатывает ZBuffer

Почему не корректно срабатывает ZBuffer

Помогите, уже второй день не могу понять, почему у меня не корректно отображается 3d сцена, плоскости не перекрываются, почему, не понятно

161
Сортировка по алфавиту

Сортировка по алфавиту

Собственно говоря мне нужно отсортировать " string name;" по алфавитуЖелательно без указателей и векторов

74
Как запустить команду в cmd

Как запустить команду в cmd

Как можно запустить команду cmd через system(""); что бы при этом не открывалась консоль именно при вызове system("");

197