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

Множественное наследование: доступ к элементу - C++

Восстановить пароль Регистрация
 
Letfar
 Аватар для Letfar
0 / 0 / 1
Регистрация: 10.12.2011
Сообщений: 47
30.11.2013, 18:47     Множественное наследование: доступ к элементу #1
Есть такая схема наследования:

Date (просто дата)

Human : public Date (дата рождения)
Car : public Date (дата покупки)
Driver : public Human, public Car, public Date (дата получения прав)

C++
1
2
3
4
5
6
7
8
Driver::Method() {
 Как в методе класа Driver получить доступ к полям (к примеру setDay()) класса Date для Саr, Human и Driver?
 
 у меня получается ошибка неоднозначности, когда я, например, пишу:
   Driver::Date::setDay(5) (дата получения прав)
 
   подскажите, как сделать правильно?
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2013, 18:47     Множественное наследование: доступ к элементу
Посмотрите здесь:

Множественное наследование C++
Множественное наследование C++
множественное наследование C++
Множественное наследование C++
C++ множественное наследование
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.11.2013, 18:50     Множественное наследование: доступ к элементу #2
наследовать предметы от даты - глупость.
но если продолжать так делать - то смотрите в сторону виртуального наследования.
http://ru.wikipedia.org/wiki/%C2%E8%...E2%E0%ED%E8%E5
Letfar
 Аватар для Letfar
0 / 0 / 1
Регистрация: 10.12.2011
Сообщений: 47
30.11.2013, 19:07  [ТС]     Множественное наследование: доступ к элементу #3
Тогда, поставлю вопрос немного по другому:

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
#include <iostream>
 
class A
{
    public:
       int foo() {
           return 1;
       }
};
 
class B: public virtual A
{
    public:
};
 
class C : public virtual A
{
   public:
};
 
class D : public B, public C, public A {};
 
int main()
{
    D d;
 
    std::cout << d.foo();
 
    return 0;
}
Как в D вызвать именно D::A::foo() а не D::B::A::foo() или D::С::A::foo() или это не возможно?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.11.2013, 19:12     Множественное наследование: доступ к элементу #4
внутри D прям так как написали жирным и вызывайте. снаружи тоже вызов можно конкретизировать:
C++
1
std::cout << d.D::A::foo();
Letfar
 Аватар для Letfar
0 / 0 / 1
Регистрация: 10.12.2011
Сообщений: 47
30.11.2013, 19:31  [ТС]     Множественное наследование: доступ к элементу #5
А как обращаться именно в методе D?
C++
1
2
3
4
5
6
7
8
9
10
class D : public B, public C, public A {
 
    void metod() {
        A::foo();  // Нельзя - А не однозначный
        D::A::foo(); // Тоже нельзя
 
        D::B::foo(); // Кроме так можно, но надо именно к первому D::А::foo()
    }
 
};
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.11.2013, 19:50     Множественное наследование: доступ к элементу #6
да фиг знает как. в студии это прокатывает, но похоже эта "фича" не соответствует стандарту.
Letfar
 Аватар для Letfar
0 / 0 / 1
Регистрация: 10.12.2011
Сообщений: 47
30.11.2013, 20:02  [ТС]     Множественное наследование: доступ к элементу #7
можно сделать class D : public B, public C, public virtual A и все обращения будут работать,
но тогда вообще нет смысла добавлять отдельную копию А, так как всегда будут изменятся поля самого базового А.

Добавлено через 3 минуты
А изначально как раз и была задача использовать копии одного класса (Date) для разных целей в множественном наследовании, но видимо, такой подход все же невозможен...
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.11.2013, 20:28     Множественное наследование: доступ к элементу #8
как я уже сказал в самом начале - наследование в этом случае - уродство какое-то.
если Date свойство какого-то предмета, то это лучше реализовать агрегацией, т.е. сделать
Date мембером класса и дать доступ к нему всем, кому это понадобится (Get/Set методы или еще как-то).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2013, 20:47     Множественное наследование: доступ к элементу
Еще ссылки по теме:

C++ Множественное наследование
C++ Множественное наследование
C++ Доступ к приватным полям, используя множественное наследование

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.11.2013, 20:47     Множественное наследование: доступ к элементу #9
Цитата Сообщение от Letfar Посмотреть сообщение
А изначально как раз и была задача использовать копии одного класса (Date) для разных целей в множественном наследовании
наследование нужно не для того, чтоб содержать в объекте чью-то копию.
Хочешь чтобы человек хранил дату? Делаю дату одним из полей Human
Yandex
Объявления
30.11.2013, 20:47     Множественное наследование: доступ к элементу
Ответ Создать тему
Опции темы

Текущее время: 11:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru