Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
#1

Неоднозначность и multiple inheritance - C++

26.10.2013, 23:37. Просмотров 1080. Ответов 24
Метки нет (Все метки)

Есть такая иерархия и main():
C++ (Qt)
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
#include <iostream>
#include <string>
#include <complex>
using namespace std;
 
class Base {
public:
    void print(string s) const { cout <<"Base::print(string)" <<endl;}
};
 
class Derived1 : public Base {
public:
    void print(int i) const {cout <<"Derived1::print(int)" <<endl;}
};
 
class Derived2 : public Base {
public:
    void print(double d) const {cout <<"Derived2::print(double)" <<endl;}
};
 
class MI : public Derived1, public Derived2 {
public:
    void print (complex<double> cd) const {cout <<"MI::print(complex<double>)" <<endl;}
};
 
int main()
{
    MI mi;
    string dancer("ASD");
    mi.print(dancer);
    return 0;
}
Что нужно изменить в определении класса MI, чтобы устранить неоднозначность? Квалификация Base:: print при вызове не помогает, так как он базовый для двух классов Derived1{,2} одновременно... ничего не идет в голову
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2013, 23:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неоднозначность и multiple inheritance (C++):

Generic inheritance. Templates - C++
Код компилируется. Не могу разобраться то ли я как не правильно иерархию построил то ли компилятор глючит. Вообщем если я пишу в...

Copy Constructor Question .Generic inheritance. Templates - C++
Допустим есть проект // // (---.Array_hpp---) // #ifndef Array_HPP // Preprocessor gates #define...

Templates. (concrete inheritance). question to destructor implementation - C++
Есть вот такой вот проект. Идея в том том что конкретный класс наследуется от темплейта. Как в таком случае ПРАВИЛЬНО + ГРАМОТНО...

Неоднозначность декларации - C++
Итак уважаемые знатоки: class Foo{ public: Foo(){}; }; Foo Bar(); Внимание вопрос: как уважающий себя...

неоднозначность, explicit - C++
Добрый вечер. написал такой шаблонный класс: template &lt;class T&gt; class Container { private: ...... public: ...

Виртуальная неоднозначность - C++
Не понимаю пример из книги С.Праты: class B { public: short q(); }; class C : virtual public B { public:

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
26.10.2013, 23:42 #2
менять можно только класс MI?
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
26.10.2013, 23:56  [ТС] #3
Цитата Сообщение от Olivеr Посмотреть сообщение
менять можно только класс MI?
Да. Так в упражнении в книге написано.

Добавлено через 12 минут
Единственное к чему я пришел - это добавить функцию MI:: print(string); но это неправильно с точки зрения ООП: ведь по логике нужно вызвать именно Base:: print(string);
Я в недоумении уже долго
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
26.10.2013, 23:56 #4
Вообще было бы неплохо сделать наследование Base виртуальным ( у Derived1 и Derived2 ). Потом дописать в MI using Base:rint и все будет работать
1
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.10.2013, 00:05 #5
gromo, полный текст задания можно?
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.10.2013, 00:16  [ТС] #6
Цитата Сообщение от Jupiter Посмотреть сообщение
полный текст задания можно?
Как изменить определение класса MI, чтобы этот фрагмент компилировался и выполнялся правильно?
Цитата Сообщение от Olivеr Посмотреть сообщение
Вообще было бы неплохо сделать наследование Base виртуальным ( у Derived1 и Derived2 ). Потом дописать в MI using Base:rint и все будет работать
Спаибо, это сработало. Да и нужды в директиве нет - ведь подобъект типа Base теперь только один.

Добавлено через 1 минуту
Исправленный вариант, может кому пригодится:
C++ (Qt)
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
#include <iostream>
#include <string>
#include <complex>
using namespace std;
 
class Base {
public:
    void print(string s) const { cout <<"Base::print(string)" <<endl;}
};
 
class Derived1 : virtual public Base {
public:
    void print(int i) const {cout <<"Derived1::print(int)" <<endl;}
};
 
class Derived2 : public virtual Base {
public:
    void print(double d) const {cout <<"Derived2::print(double)" <<endl;}
};
 
class MI : public Derived1, public Derived2 {
public:
    void print (complex<double> cd) const {cout <<"MI::print(complex<double>)" <<endl;}
};
 
int main()
{
    MI mi;
    string dancer("ASD");
    mi.print(dancer);
    return 0;
}
0
Миниатюры
Неоднозначность и multiple inheritance  
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.10.2013, 00:20  [ТС] #7
P.s. Это задание было перед началом раздела "Виртульное наследование". Видимо так авторы решили "подшутить" над читателем - ведь мне еще не было известно про эту возможность. Поломайте голову, новички, полезно
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.10.2013, 00:22 #8
Цитата Сообщение от gromo Посмотреть сообщение
Как изменить определение класса MI, чтобы этот фрагмент компилировался и выполнялся правильно?
с такой формулировкой можно:
1) просто MI унаследовать от Base
2) реализовать в MI соответствующую перегрузку для string
виртуальное наследование не подходит под такую формулировку задания
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.10.2013, 00:22 #9
Цитата Сообщение от gromo Посмотреть сообщение
Спаибо, это сработало. Да и нужды в директиве нет - ведь подобъект типа Base теперь только один.
И как это решение сочетается с заданием:
Цитата Сообщение от gromo Посмотреть сообщение
Как изменить определение класса MI, чтобы этот фрагмент компилировался и выполнялся правильно?
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.10.2013, 00:26  [ТС] #10
Цитата Сообщение от alsav22 Посмотреть сообщение
И как это решение сочетается с заданием:
Сам не понимаю, это, нверное, такой прикол от авторов. Как подготовка перед следующим этапом.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.10.2013, 00:32 #11
Что за книга?
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.10.2013, 00:35  [ТС] #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Что за книга?
Стенли Липпман, Жози Лажойе "C++ Primer" 3rd Edition.
Глава 18, Упр. 18.12 (сразу же перед разделом "Виртуальное наследование").
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2013, 01:06 #13
C++
1
2
3
4
5
class MI : public Derived1, public Derived2 {
public:
    using Base::print;
    void print (complex<double> cd) const {cout <<"MI::print(complex<double>)" <<endl;}
};
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.10.2013, 01:30 #14
Странно... Студия подчёркивает Base :: print и dancer, но компилируется. mingw: mi.print(dancer) не пропускает.
0
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
27.10.2013, 03:10  [ТС] #15
Цитата Сообщение от I.M. Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
class MI : public Derived1, public Derived2 {
public:
     using Base::print;
     void print (complex<double> cd) const {cout <<"MI::print(complex<double>)" <<endl;}
};
нее, так тоже неоднозначность: функции какого подобъекта вводить в область видимости MI: Derived1::Base или Derived2::Base ?
Цитата Сообщение от alsav22 Посмотреть сообщение
Странно... Студия подчёркивает Base :: print и dancer, но компилируется. mingw: mi.print(dancer) не пропускает.
Да уж, действительно странно. У меня GCC 4.8.2 тоже ругается. Вот незадача
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 03:10
Привет! Вот еще темы с ответами:

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

Неоднозначность переменной count - C++
Доброго времени суток. Использую VS2013. Подскажите пожалуйста, по какой причине глобальная переменная, в приведенном ниже коде, не...

Неоднозначность при множественном наследовании - C++
Привет всем, столкнулся с проблемой при множественном наследовании классов. Надеюсь, кто-нибудь поможет как можно скорее. Ошибка...

компилятор находит неоднозначность при вызове round(i) - C++
Доброго времени суток! Подскажите, компилятор находит неодназначтность в строке 26 *вызов функции round(i)* ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.10.2013, 03:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru