Множественное наследование с++

164
25 марта 2019, 09:30

Прошу вашей помощи в объяснении множественного наследования. Возникают проблемы с наследованием методов. Вот пример есть метод fill(); который заполняет поля объекта ). В классе Транспорт он заполняет общие поля , и что бы не дублировать код в классах наследниках я вызываю этот метод в методе fill(); Класса сухопутный транспорт и водный транспорт. Но получаетcя если я буду реализовывать класс Амфибии мне нужно будет вызвать метод fill(); из классов сухопутный транспорт и водный транспорт. Что приведёт к вызову метода fill(); класса Транспорт дважды. Скорее всего я делаю всё не так как нужно, поэтому нуждаюсь в толковом объяснении что да как делать. Все были когда-то новичками, поэтому прошу отнестись с пониманием!

#include <iostream>
#include <stdio.h>

using namespace std;
class Transport {
public:
    float weight;
    float loadСapacity; // грузоподьёмность
    string color;

    virtual void fill() {
        cout << "Enter weight: "  << endl;
        cin >> weight;
        cout << "Enter color: " << endl;
        cin >> color;
        cout << "Enter load capacity: " << endl;
        cin >> loadСapacity;
    }
    void beep() {
        cout << "Beeep-beeep";
    }
public:
};
class LandTransport : public virtual Transport {   //назевемный транспорт
protected:
    void fillOnlyLand(){
        cout << endl;
        cout << "Enter number Of Wheels: ";
        cin >> numberOfWheels;
        cout << "Enter land speed: ";
    }
    int numberOfWheels,landSpeed; // колличество колёс, cкорость на суше
     void fill()override{
        Transport::fill();
        fillOnlyLand();
    }

    void drive() {
        cout << "Brrrrr I'm going by land....... "<<endl;
    }
};
class WaterTransport:public virtual  Transport{  // Водный транспорт
public:
    float displacement,waterSpeed; // водоизмещение,скорость на воде
   void fill()override{
       Transport::fill();
       cout << "Enter displacement: ";
            cin >> displacement;
       cout << "Enter water Speed ";
       cin >>waterSpeed;
   }
    void swimming() {
        cout << "Yuhhu I'm swimming"<<endl;
    }
};
class Amphibian:public LandTransport, public WaterTransport{  //  машины-амфибии
    void fill()override{
    }
};

int main() {

    cin.get();
    cin.get();
    return 0;
}
Answer 1

Собственно у вас в коде уже есть намёк на решение. Нужно иметь в промежуточных классах функцию заполнения только специфической информации (без базовой части Transport). Например, я вижу функцию fillOnlyLand() для LandTransport. Аналогичную надо завести и для WaterTransport. А в классе амфибии для функции fill вызывать следующую цепочку:

Transport::fill();
LandTransport::fillOnlyLand();
WaterTransport::fillOnlyWater();
READ ALSO
Странные проблемы с линковкой SFML [дубликат]

Странные проблемы с линковкой SFML [дубликат]

На данный вопрос уже ответили:

168
Почему возникает ошибка: Cannot open include file: &#39;QImage&#39;: No such file or directory?

Почему возникает ошибка: Cannot open include file: 'QImage': No such file or directory?

QtCreator не видит библиотеку QImage, хотя сам мне её предлагает в списке

148
Java - чтение файла

Java - чтение файла

Компилирую проект в jar-файлЗапускаю

198
Поиск даты вида &ldquo;February 4,2000&rdquo; в Java

Поиск даты вида “February 4,2000” в Java

"Все даты представить в формате «ddmm

142