Как обратиться к методу родительского класса в зависимости от типа данных?

Есть три класса, где третий класс является наследником первых двух. Во всех трех классах есть конструкторы и метод Get, который возвращает поле данного класса. Как при попытке перегрузить вставки в поток вывода вывести значения всех трех классов? В коде ниже происходит просто вызов метода Get для типа char, то есть внутри класса Derived и соответственно выводиться сначала трижды "V", а потом трижды "A".

#include <iostream>;
#include <string>;
#include <locale>;
using namespace std;

class Base1 {
private:
    int i;
public:
    Base1() {
        i = 0;
    }
    Base1(int i_o) {
        i = i_o;
    }
    int Get() {
        return i;
    }
};

class Base2 {
private:
    string name;
public:
    Base2() {
        name = "Пусто";
    }
    Base2(string name_o) {
        name = name_o;
    }
    string Get() {
        return name;
    }
};

class Derived :  public Base2, public Base1 {
private:
    char ch;
public:
    Derived() {
        ch = 'V';
        cout << "Конструктор Derived без параметров \n";
    }
    Derived(char ch_o, string name_o, int i_o): Base2(name_o), Base1(i_o){
        ch = ch_o;
        cout << "Конструктор Derived с параметрами \n";
    }
    char Get() {
        return ch;
    }

    friend ostream& operator<<(ostream& out, Derived& ob);
};

ostream& operator<<(ostream& out, Derived& ob) {
    return out << ob.Get() << "\n" << ob.Get() << "\n" << ob.Get() << "\n";
}

int main() {
    setlocale(LC_ALL, "Russian");
    Derived ob, ob2('A',"bubble",3);
    cout << ob << ob2;
    return 0;
}

Возможно нужно использовать using, однако при попытке это сделать происходят ошибки.(возможно не так делаю). Обратиться в перегрузке операторов напрямую к полям первых двух классов нельзя в связи с использованием "private".


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

Автор решения: Иван Киселёв группа ИАС-20

Обратиться в перегрузке операторов напрямую к полям первых двх классов нельзя в свяди с использованием "private".

Ну так поставь "protected", в чем проблема)

→ Ссылка
Автор решения: KoVadim

Если функции имеют одинаковые имена, можно подсказать компилятору, с какого класса их взять. Это будет где то так

ostream& operator<<(ostream& out, Derived& ob) {
    return out << ob.Get() << "\n" << ob.Base2::Get() << "\n" << ob.Base1::Get() << "\n";
}

и теперь вывод будет где то такой

V
Пусто
0
A
bubble
3
→ Ссылка