7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74

Компиляция кода с ромбовидным наследованием

16.12.2016, 09:50. Показов 2394. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я написал элементарное наследование. На VS 2015 всё компилится, а на CLion нет. В чём может быть проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A {
protected:
    int a;
public:
    A(int i) : a(i) {}
};
 
class B : public A {
public:
    B(int i) : A(i) {}
};
 
class C : public B, public A {
public:
    C(int i1, int i2) : B(i1), A(i2) {}
    void print() { std::cout << "B(" << B::a << "), A(" << A::a << ")"; }
};
 
int main()
{
    C cc(2, 1);
    cc.print();
}
Причём если не обращаться к полю класса, то всё хорошо, но при обращении вылетает ошибка
error: ‘A’ is an ambiguous base of ‘C’

У меня есть только одно предположение. В VS выдаётся точно такое же сообщение, но в качестве предупреждения, а не ошибки. Возможно в CLion другой уровень возбуждения этой ошибки и можно прописать #pragma warning(disable : ) и всё начнёт работать как надо?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2016, 09:50
Ответы с готовыми решениями:

Компиляция/добавление кода без видимости самого кода(сложно объяснить)
Есть код по типу такого: static void Main() { Hm.Ex checker = new Hm.Ex();//Hm - namespace, Hm.Ex - class ...

Исполнение кода, написанного в текстовом файле (динамическая компиляция кода)
к примеру есть у меня форма а на ней кнопка, можно ли присваивать код кнопке с текстового файла? пример в текстовике: ...

Формирование низкоуровневого кода (компиляция кода на С из текстового файла)
Доброго времени суток, форумчане. Необходима информация о трансляции Си (без плюсов и решеток) кода в нечто более низкоуровневое...

31
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
16.12.2016, 11:25
Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
class MemoryInfo {};
class HDDInfo: virtual public MemoryInfo {};
class RAMInfo: virtual public MemoryInfo {};
 
class ProcessorInfo{};
class CPUInfo: virtual public ProcessorInfo {};
class GPUInfo: virtual public ProcessorInfo {};
 
class VideoAdapterInfo: public GPUInfo, virtual public RAMInfo {};
 
class PCInfo: public HDDInfo, public RAMInfo, public CPUInfo, public VideoAdapterInfo {};
Но опять же структура наследования явно не продумана. Где-то нужно наследование, где-то агрегация.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
16.12.2016, 11:26
Цитата Сообщение от LoSyAsH Посмотреть сообщение
Я правильно понял, что ты имеешь ввиду, что у меня должен быть отдельный класс PC_RAM и VideoAdapter_RAM?
Вообще не совсем. Я объяснял уважаемому JIawliet что по моему мнению от тебя хотят преподаватели.
При наследовании у тебя в результирующем объекте PCInfo будут находиться два подобъекта RAMInfo, JIawliet сказал, что это неверно, а я просто предположил ход мыслей того, кто давал это задание; Расчет был на то, что оперативная память и память видеокарты - это разные объекты, поэтому их должно быть два (это и порождает неоднозначность, но похоже требуется по заданию).

Что касается твоего предположения
Цитата Сообщение от LoSyAsH Посмотреть сообщение
у меня должен быть отдельный класс PC_RAM и VideoAdapter_RAM?
то на мой взгляд это было бы лучшим компромиссным решением, т.к. ты недалеко ушел бы от схемы, которую тебе нарисовали, но и в то же время разрешил проблему неоднозначности. Плюс к этому, в реальном мире, оперативная память видеокарты, естественно, не то же самое, что ОЗУ компьютера.
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
16.12.2016, 11:29
Цитата Сообщение от DrOffset Посмотреть сообщение
JIawliet сказал, что это неверно
наоборот) я согласился, так как это самое логичное объяснение происходящего) хотя на схеме все иначе(
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
16.12.2016, 11:30
Цитата Сообщение от JIawliet Посмотреть сообщение
хотя на схеме все иначе(
Нет, там именно так и нарисовано, иначе откуда бы я взял эту версию?
А про "неверно", ты говорил ранее до этого - я об этом.
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:33  [ТС]
Думаю, обсуждение можно пока приостановить. Позже отпишу, помогло удаление ключа исправить проблему или нет
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.12.2016, 11:35
Цитата Сообщение от LoSyAsH Посмотреть сообщение
при обращении вылетает ошибка
error: ‘A’ is an ambiguous base of ‘C’
http://rextester.com/YKYR43650
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
#include <iostream>
 
template<class T> struct ram 
{ 
    ram(const size_t v): memory(v){}
    size_t memory; 
};
 
struct video : ram<video> 
{
    video(const size_t v): ram<video>(v){}
};
 
struct cpu : ram<cpu> 
{
    cpu(const size_t v): ram<cpu>(v){}    
};
 
struct computer : video, cpu
{
    computer(const size_t memVideo, const size_t memCPU)
        : video(memVideo)
        , cpu(memCPU)
    {}
    
    void print() const 
    { 
        std::cout << "Video RAM .. " << video::memory << " Gb" << std::endl;
        std::cout << "CPU RAM .... " << cpu::memory   << " Gb" << std::endl;
        
        
    }
};
 
int main()
{
    computer pentium(16, 64);
    pentium.print();
}
1
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
16.12.2016, 11:38
Цитата Сообщение от JIawliet Посмотреть сообщение
хотя на схеме все иначе(
Вот я специально даже обвел красненьким

Если вдруг у кого еще сомнения.
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 11:38  [ТС]
Неплохая идея. Если ничего не поможет, то реализую RAM как шаблонный класс.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.12.2016, 11:44
Цитата Сообщение от LoSyAsH Посмотреть сообщение
Если ничего не поможет, то реализую RAM как шаблонный класс.
в вашем случае это - единственный способ порешать задачу не выходя за рамки требований.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
16.12.2016, 12:16
LoSyAsH, кстати, предупреждение, может все равно превратиться в ошибку, если неоднозначность будет действительно мешать (а не просто быть). Например если в класс RAMInfo поместить функцию, то вызвать ее через PCInfo будет невозможно.
0
7 / 7 / 9
Регистрация: 22.10.2015
Сообщений: 74
16.12.2016, 12:23  [ТС]
а её нельзя будет вызвать через расширение области видимости? VideoAdapter::func()?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
16.12.2016, 12:27
Цитата Сообщение от LoSyAsH Посмотреть сообщение
а её нельзя будет вызвать через расширение области видимости? VideoAdapter::func()?
Можно, а вот функцию для подобъекта RAMInfo, который изображает оперативную память, уже не получится.
Т.к. эта функция одновременно будет и в подобъекте VideoAdapter. В этом и заключается неоднозначность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2016, 12:27

Компиляция кода
Здраствуйте,есть код на хаскелле,при компиляции через сервис http://codepad.org/ жалуется на 9ую строку(хотя это только начало). ...

Компиляция кода
пытался через консоль скачать следующий модуль &quot;pip install pyinstaller&quot; но выходит ошибки (на фото ниже) гуглил не нашел чего то...

Компиляция кода
Как компилировать код в Python 3.7+?

Компиляция кода
Доброго времени суток. Имеется М-файл с кодом. Суть кода: читаем фото, пропускаем через фильтры, на выходе имеем некую матрицу, в которой...

Компиляция с++ кода на с#
Здравствуйте, такой вопрос: Есть код на с++, который пишется в текстбоксе. Мне нужно его скомпилировать, как это сделать? Может есть...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru