Задание от преподавателя ООП в вузе. Вычислить сумму чисел наследуемых классов используя методы доступа. И такая схема. Как я понимаю, наследуется структура класса, а не значения переменных в его объектах и т.д. Это вообще возможно?
#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;
}
Может как-то так?
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;
}
Странно, но это работает. Пришлось использовать виртуальное наследование.
#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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Помогите, уже второй день не могу понять, почему у меня не корректно отображается 3d сцена, плоскости не перекрываются, почему, не понятно
Собственно говоря мне нужно отсортировать " string name;" по алфавитуЖелательно без указателей и векторов
Как можно запустить команду cmd через system(""); что бы при этом не открывалась консоль именно при вызове system("");