Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
11 / 11 / 3
Регистрация: 22.10.2011
Сообщений: 19

Проблемы при ромбовидном наследовании

15.12.2011, 19:59. Показов 3176. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть ромбовидное наследование. От Ship наследуются виртуально GuardShip и TransShip, а TransGuardShip наследуется от них.
Компилятор сообщает о такой ошибке: error C2250: TransGuardShip: неоднозначное наследование "TransShip *Ship::copy(void) const"
Причем если поменять строчку
C++
1
class TransGuardShip : public TransShip, public GuardShip
на
C++
1
class TransGuardShip : public GuardShip, public TransShip
то компилятор будет писать: error C2250: TransGuardShip: неоднозначное наследование "GuradShip *Ship::copy(void) const"

Но при этом
C++
1
2
 virtual std::ostream& show(std::ostream &) const;
virtual std::istream& get(std::istream &);
наследуются нормально. Кто-нибудь может предложить решение этой проблемы?
PS: Понимаю, что ромбовидное наследование вещь гадкая, но по условию оно должно быть

Базовый класс Судна:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef _SHIP_H_
#define _SHIP_H_
 
#include "stdafx.h"
#include <iostream>
#pragma once
#include "Captain.h"
 
//базовый класс Судно
 
 
class Ship {    
    char *name;
    Captain cap;
    int draft;      // водоизмещение
    int maxSpeed;
    int numberOfCrew;   // кол-во экипажа
protected:
    virtual std::ostream& show(std::ostream &) const;
    virtual std::istream& get(std::istream &);
    virtual Ship* copy() const = 0;
public:
    Ship() {
        name = 0;
        draft = 0;
        maxSpeed = 0;
        numberOfCrew = 0;
    }
    friend std::ostream &operator << (std::ostream &, const Ship &);
    friend std::istream &operator >> (std::istream &, Ship &);
    Ship(char *_Name, Captain _cap, int _draft, int _maxSpeed, int _numberOfCrew);
    Captain getCap() const {return cap;}
    Captain setCap();
    char *getName() const {return name;}
    char *setName();
    int getDraft() const {return draft;}
    int setDraft();
    int getMaxSpeed() const {return maxSpeed;}
    int setMaxSpeed();
    int setMaxSpeed(int);
    int getNumberOfCrew() const {return numberOfCrew;}
    int setNumberOfCrew();
};
 
#endif // _SHIP_H_

Транспортный корабль:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef _TRANS_SHIP_H_
#define _TRANS_SHIP_H_
 
#include "stdafx.h"
#include <iostream>
#pragma once
#include "Ship.h"
#include "LawOfMotion.h"
#include "BiLineLawOfMotion.h"
#include "BiSqrLawOfMotion.h"
#include "LineLawOfMotion.h"
#include "SqrLawOfMotion.h"
 
class TransShip : virtual public Ship {
    LawOfMotion *pLaw;
    int weight;
protected:
    //LawOfMotion *pLaw;
    //int weight;
    virtual std::ostream& show(std::ostream &) const;
    virtual std::istream& get(std::istream &);
    virtual TransShip* copy() const;
public:
    
    TransShip():Ship() {
        weight = 0;
        pLaw = 0;
    }
    TransShip(char *_Name, Captain _cap, int _draft, int _maxSpeed, int _numberOfCrew, int _weight, LawOfMotion *law):Ship(_Name, _cap, _draft, _maxSpeed, _numberOfCrew) {
        weight = _weight;
        pLaw = law;
    }
    LawOfMotion * getLaw() const {return pLaw;}
    int getWeight() const {return weight;}
    int setWeight();
    int getCurrentSpeed(); // изменение скорости по закону
    void setLaw(LawOfMotion *);
};
 
 
 
#endif // _TRANS_SHIP_H_

Военный корабль:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#ifndef _GUARD_SHIP_H_
#define _GUARD_SHIP_H_
#include <iostream>
#include <vector>
#pragma once
#include "stdafx.h"
#include "Ship.h"
#include "Armament.h"
 
using namespace std;
 
class GuardShip : virtual public Ship {
    //vector<Armament>::iterator p;
    vector<Armament> arma;
protected:
    virtual std::ostream& show(std::ostream &) const;
    virtual std::istream& get(std::istream &);
    virtual GuardShip* copy() const;
public:
    GuardShip():Ship() {
        vector<Armament> arma;
    }
    GuardShip(char *_Name, Captain _cap, int _draft, int _maxSpeed, int _numberOfCrew, vector<Armament> arma_):Ship(_Name, _cap, _draft, _maxSpeed, _numberOfCrew) {
        arma = arma_;
    }
    
    void addArm(const Armament& arma);
    void removeArm(Armament &arms);
    Armament &findArm(Armament &arms);
    Armament &findArm(char*);
    void getFullInfoArm(Armament &arms);
    void setFullArm(Armament &arms);
    char* setNameArm(Armament &arms) {return findArm(arms).setName();}
    char* getNameArm(Armament &arms) {return findArm(arms).getName();}
    double getCalArm(Armament &arms) {return findArm(arms).getCal();}
    double setCalArm(Armament &arms) {return findArm(arms).setCal();}
    size_t getRangeArm(Armament &arms) {return findArm(arms).getRange();}
    size_t setRangeArm(Armament &arms) {return findArm(arms).setRange();}
    location getLocArm(Armament &arms) {return findArm(arms).getLoc();}
    location setLocArm(Armament &arms) {return findArm(arms).setLoc();}
    size_t getAmmoArm(Armament &arms) {return findArm(arms).getAmmo();}
    size_t setAmmoArm(Armament &arms) {return findArm(arms).setAmmo();}
    void shootArm(Armament &arms) {findArm(arms).shoot();}
};
 
#endif // _GUARD_SHIP_H_
Военно-транспортный кораблик:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef _TRANS_GUARD_SHIP_H_
#define _TRANS_GUARD_SHIP_H_
#pragma once
 
#include "stdafx.h"
#include <iostream>
 
#include "TransShip.h"
#include "GuardShip.h"
 
class TransGuardShip : public TransShip, public GuardShip {
    std::istream& get(std::istream &);                              // show почему-то было 
    TransGuardShip* copy() const;
    std::ostream& show(std::ostream &) const;
public:
    TransGuardShip() : TransShip(), GuardShip(), Ship() {;}
    TransGuardShip(char *_Name, Captain _cap, int _draft, int _maxSpeed, int _numberOfCrew, int _weight, LawOfMotion *law, vector<Armament> arma_); //:  
    //GuardShip(_Name,  _cap, _draft, _maxSpeed,  _numberOfCrew,  arma_), 
    //TransShip(_Name,  _cap, _draft, _maxSpeed, _numberOfCrew,  _weight, law) {;}
    friend std::istream &operator >> (std::istream &is, TransGuardShip &ship);
    friend std::ostream &operator << (std::ostream &os, const TransGuardShip &ship);
};
 
#endif // _TRANS_GUARD_SHIP_H_
Добавлено через 59 минут
А может проблема кроется в том, что функция copy() является чисто виртуальной?

Добавлено через 1 час 43 минуты
Вот кстати текст самой функции copy()
C++
1
2
3
TransShip* TransShip::copy() const {
    return new TransShip(*this);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2011, 19:59
Ответы с готовыми решениями:

Использование шаблонов при наследовании, ошибка при компиляции
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

Ошибка при наследовании
Вот такой код: class Figure2 { protected: int Color; int CenterX; int CenterY; public:

Конструкторы при наследовании
Добрый вечер. Пишу программу с наследованием классов. Класс-родитель - nasled, производный от него - steck. Когда пытаюсь вызвать...

7
0 / 0 / 0
Регистрация: 11.01.2011
Сообщений: 7
28.01.2012, 11:02
Столкнулся с абсолютно такой же проблемой, помогите решить. Объясните, что здесь не так, и как нужно сделать правильно.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.01.2012, 11:48
huichos, вот минимальный код, повторяющий вашу архитектуру (именно его вы должны были привести, а не то, что есть сейчас; минимальный компилируемый (или наоборот, повторяющий ошибки) пример, без лишних деталей). Всё компилируется. Подозреваю, что это очередной косяк компилятора от МС.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
28.01.2012, 11:50
vs? если да, то меняйте компилятор. в vs до сих пор есть баг, который не позволяет переваривать подобное. хотя разработчики компилятора обещали исправить это, но пока что баг никуда не делся. gcc переваривает и не давится
0
28.01.2012, 12:05

Не по теме:

Цитата Сообщение от retmas Посмотреть сообщение
vs?
#include "stdafx.h" :D

0
28.01.2012, 12:11

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение

Не по теме:


#include "stdafx.h" :D

такое палево и не заметил:pardon:

0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
28.01.2012, 17:17
На какой строке ошибка?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.01.2012, 17:18
lemegeton, не на какой, как выяснилось. Ошибка из-за бака мелкомягкого компилятора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2012, 17:18
Помогаю со студенческими работами здесь

С++ течет при наследовании
Если был создан класс где его поля размещались в стеке (Foo) и унаследован классом (Foo1) который создается динамически. Как...

Сравнение при наследовании
Есть базовый класс, пусть его зовут А, а у него есть 4 потомка. Пусть их зовут: B, C, D и E. Базовый класса абстрактный,в нём есть...

Присвоение при наследовании
Всем доброго дня ! Подскажите пожалуйста как сделать так , что-бы при выполнении операции a = c; вызывались операторы = обеих ...

Ошибка при наследовании
Привет! Ни как не могу разобраться, в чём дело. Создал 2 класса: Base и Derived, где Derived наследует Base. Но при компиляции возникает...

Неоднозначность при наследовании
Привет народ, думаю мой вопрос покажется вам чем-то из разряда &quot;лучше бы делом занялся&quot;, но тех у кого останется терпение, прошу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru