С++ ООП. Множественное наследование

Рейтинг: 1Ответов: 1Опубликовано: 05.04.2023

Всем привет! Помогите, пожалуйста, исправить проблему. У меня есть код, в который подается идентификатор, допустим Object.

Вывод должен выводить

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

Но выводит

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

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

class cl_1 {
protected:
    string name;
public:
    cl_1(){}
    cl_1(string name) {
        this->name = name + "_1";
    }

    void get_name() {
        cout << this->name << endl;
    }
};

class cl_2 : virtual public cl_1 {
protected:
    string name;
public:
    cl_2(string name) : cl_1(name + "_2") {
        this->name = name + "_2";
    }

    void get_name() {
        cout << this->name << endl;
    }

};

class cl_3 : virtual  public cl_1 {
protected:
    string name;
public:
    cl_3(string name) : cl_1(name + "_3") {
        this->name = name + "_3";
    }

    void get_name() {
        cout << this->name << endl;
    }

};

class cl_4 : virtual public cl_1 {
protected:
    string name;
public:
    cl_4(string name) : cl_1(name + "_4") {
        this->name = name + "_4";
    }

    void get_name() {
        cout << this->name << endl;
    }

};

class cl_5 : virtual public cl_1 {
protected:
    string name;
public:
    cl_5(string name) : cl_1(name + "_5") {
        this->name = name + "_5";
    }

    void get_name() {
        cout << this->name << endl;
    }

};

class cl_6 : public cl_2, public cl_3 {
protected:
    string name;
public:
    cl_6(string name) : cl_1(name + "_6"), cl_2(name + "_6"), cl_3(name + "_6") {
        this->name = name + "_6";
    }

    void get_name() {
        cout << this->name << endl;
    }

};

class cl_7 : public cl_4, public cl_5 {
protected:
    string name;
public:
    cl_7(string name) : cl_1(name + "_7"), cl_4(name + "_7"), cl_5(name + "_7") {
        this->name = name + "_7";
    }

    void get_name() {
        cout << this->name << endl;
    }

};

class cl_8 : public cl_6, public cl_7 {
protected:
    string name;
public:
    cl_8(string name) : cl_1(name + "_8"), cl_6(name + "_8"), cl_7(name + "_8") {
        this->name = name + "_8";
    }

    void get_name() {
        cout << this->name << endl;
    }

};

int main() {
    string identifier;
    cin >> identifier;

    cl_8 obj8(identifier);
    cl_8* ptr = &obj8;
    ptr->cl_6::cl_2::cl_1::get_name(); // должно вывести "Object_8_6_2_1"
    ptr->cl_6::cl_3::cl_1::get_name(); // должно вывести "Object_8_6_3_1"
    ptr->cl_8::cl_1::get_name();
    ptr->cl_8::cl_1::get_name();
    ptr->cl_8::cl_6::cl_2::get_name();
    ptr->cl_8::cl_6::cl_3::get_name();
    ptr->cl_8::cl_7::cl_4::get_name();
    ptr->cl_8::cl_7::cl_5::get_name();
    ptr->cl_8::cl_6::get_name();
    ptr->cl_8::cl_7::get_name();
    ptr->get_name();
    return 0;
}

Ответы

▲ 2Принят

Ваш класс cl_1 вы виртуально наследуете. Это значит, что его экземпляр существует в одном лице.
Вот как выглядит ваше дерево классов :

      - 1 -
    /  / \  \
  2   3   4   5
   \ /     \ /
    6       7
      \   /
        8

При вызове конструктора объекта cl_8

cl_8(string name) : 
  cl_1(name + "_8"),
  cl_6(name + "_8"),
  cl_7(name + "_8") 

Конструктор класса cl_1 будет вызван один раз и как раз с таким именем Object_8_1.
Имя в классе cl_1 физически не может иметь разные имена одновременно. Ни _8_6_2_1 .. ни _8_7_5_1 и т.д.