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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Alex992
5 / 5 / 1
Регистрация: 13.03.2011
Сообщений: 30
#1

Наследование - C++

20.07.2011, 09:19. Просмотров 1312. Ответов 15
Метки нет (Все метки)

Добрый день. Мне нужно реализовать такую структуру классов: есть класс 1, от него наследуются три класса: 2.1, 2.2, 2.3. От этих трех классов нужно множественно унаследовать класс 3. Не возникнет ли каких-нибудь проблем, например, с тем, что все классы 2 будут иметь какое-то одинаковое поле класса 1 и при слиянии их в класс 3 возникнет какой-нибудь конфликт, или в 3 будет три одинаковых метода и т.д.?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2011, 09:19     Наследование
Посмотрите здесь:

Наследование - C++
Всем доброго времени суток! Начали изучать наследование, вроде все и понятно, но и с другой стороны нет(((( Вот вопрос: есть сразу...

Наследование С++ - C++
Есть базовый клас Data. Клас person наследует Data . Клас waiter наследует класы person и Data . Нужно перегрузить операцию вывода для...

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

Наследование - C++
Помогите!! есть два класса: дверцы и доска, из этих классов наследуется класс шкаф, а из класса шкаф наследуется кшишкова шкаф. Показать по...

Наследование - C++
Добрый вечер, помогите пожалуйста с наследованием. Написал программу ( ниже ), но как видите пришлось в классе-наследнике Bus ( Vehicle...

Наследование - C++
Наследование 1)Должна быть табличка 3*3 2)Разные типы наследования 3)программа в в которой будет наследоваться клас 4) наследуются...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
20.07.2011, 09:22     Наследование #2
Alex992, обязательно возникнет. Гуглить "ромбовидное наследование". Для решения проблем - виртуальный базовый класс. Также нужно обратить внимание на "принцип доминирования"...
LosAngeles
Заблокирован
20.07.2011, 18:44     Наследование #3
ну да надо :: всё разруливать, потому что будет три экземпляра класса 1. Или наследовать виртуально, наверно это и нужно, пишешь так
C++
1
2
3
class derived : virtual public base
{
}
тогда один экземпляр будет класса 1
rrrFer
Заблокирован
20.07.2011, 20:23     Наследование #4
если базовый класс абстрактный и не имеет полей - то он может повторяться (его не обязательно делать виртуальным). Про это хорошо Страуструп написал.
Цитата Сообщение от LosAngeles Посмотреть сообщение
ну да надо :: всё разруливать
а про это я у Страуструпа не видел, не приведете пример?
Alex992
5 / 5 / 1
Регистрация: 13.03.2011
Сообщений: 30
20.07.2011, 21:57  [ТС]     Наследование #5
Спасибо, разобрался. Вот неплохая статья, если кому еще понадобится http://www.devdoc.ru/index.php/conte...nheritance.htm

Добавлено через 1 час 11 минут
Сделал все классы 2 наследованными от 1 по virtual public и возник еще один вопрос: конструктор класса 1 имеет параметр, у всех конструкторов классов 2 есть параметр, передающийся конструктору 1 + по одному своему параметру на каждый. По идее, конструктор класса 3 должен принимать три параметра для передачи в конструкторы 2 + один параметр для передачи в 1. Возникает ошибка
Код
E2251 Cannot find default constructor to initialize base class '1'
Как быть с этим?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.07.2011, 22:04     Наследование #6
показывайте код
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
20.07.2011, 22:55     Наследование #7
Вы невнимательно прочли статью, ссылку на которую привели. Конструктор виртуального базового класса вызывается только один раз в самом нижнем производном классе. Все остальные вызовы этого конструктора в других классах игнорируются. Отсюда следует, что этот конструктор обязан быть в каждом производном классе от виртуального базового. Но вообще специалисты советуют проектировать так, чтобы виртуальный базовый класс инициализировался конструктором по умолчанию.
Вот модифицированный пример из той статьи:
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
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string  T_str;
/////////////////////////////////////////////////////////////////////////////////////////
class A
{
    T_str a;
public:
    A(const T_str& iInit) : a(iInit)
    {}; 
    //-----------------------------------------------------------------------------------
    void print_A()
    {
        std::cout << "a = "
                  << a
                  << std::endl;
    }
};
///////////////////////////////////////////////////////////////////////////////////////// 
class B1 : virtual public A
{ 
    int b1;
public:
    B1() : b1(0xb1), A("B1")    
    {};
};
///////////////////////////////////////////////////////////////////////////////////////// 
class B2 : virtual public A
{
    int b2;
public:
    B2() : b2(0xb2), A("B2"){};
};
/////////////////////////////////////////////////////////////////////////////////////////
class C : public B1, public B2
{
    int c;
public:
    C() : c(0x0c), A("C"){};
};
///////////////////////////////////////////////////////////////////////////////////////// 
class D: public C
{
    int d;
public:
    D() : d(0x0d), A("D"){};
};
///////////////////////////////////////////////////////////////////////////////////////// 
int main()
{
    D d;    
    d.print_A();
}
LosAngeles
Заблокирован
21.07.2011, 11:25     Наследование #8
Цитата Сообщение от rrrFer Посмотреть сообщение
а про это я у Страуструпа не видел, не приведете пример?
ну вот так как то. Если base невиртуально наследован, то в строках 44 и в самом конце 46-ой возникает неоднозначность
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
47
48
49
50
51
52
53
54
55
56
57
58
59
class base
{   
public:
    base() : gg("base")
    {
        cout << gg << endl;
    }
 
    string gg;
};
 
class derived1 :
        virtual public base
{
public:
    derived1() : base(), gg("derived1")
    {
        cout << this->gg << endl << this->base::gg << endl;
    }
 
    string gg;
};
 
class derived2 :
        virtual public base
{
public:
    derived2() : base(), gg("derived2")
    {
        cout << gg << endl << this->base::gg << endl;
    }
 
    string gg;
};
 
class superderived :
        public derived1,
        public derived2
{
public:
 
    superderived() : derived1(), derived2(), gg("superderived")
    {
        base::gg = "her";
        cout << this->gg << endl << this->derived1::gg << endl << this->derived2::gg << endl
                << this->derived1::base::gg << "==" << this->derived2::base::gg << "==" << this->base::gg << endl;
    }
 
    string gg;
};
 
 
int main()
{
    superderived sd;
 
    return 0;
 
}
Добавлено через 2 минуты
ну я как можно больше колизий пытался замутить
rrrFer
Заблокирован
21.07.2011, 11:49     Наследование #9
LosAngeles, про проблемы пирамидального наследования я знаю
хотел узнать как вы решите эти проблемы при помощи "::"
еще раз цитирую:
Цитата Сообщение от LosAngeles Посмотреть сообщение
ну да надо :: всё разруливать
LosAngeles
Заблокирован
21.07.2011, 11:52     Наследование #10
Цитата Сообщение от rrrFer Посмотреть сообщение
хотел узнать как вы решите эти проблемы при помощи "::"
вроде я все разрулил в своём примере, ну создайте эти проблемы, а я разрулю. Просто я больше не вижу никаких проблем
rrrFer
Заблокирован
21.07.2011, 12:11     Наследование #11
Цитата Сообщение от LosAngeles Посмотреть сообщение
вроде я все разрулил в своём примере
Цитата Сообщение от LosAngeles Посмотреть сообщение
ну да надо :: всё разруливать, потому что будет три экземпляра класса 1. Или наследовать виртуально
вот вы пишите что можно решить проблемы при помощи "::", или, используя виртуальное наследование. (ключевые слова выделил жирным)В примере вы решили при помощи виртуального наследования. Я же изначально просил пример без него, но чтобы проблемы решались "::".

Извините, если придираюсь, - случайно
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.07.2011, 12:12     Наследование #12
а зачем такие сущности создавать, которых трудно поискать?
кто-нибудь может пример привести существования такого наследования в жизни? обычно в качестве примера приводят "форма" -> "треугольник", "прямоугольник", "эллипс". а теперь придумайте что-нибудь, что бы было одновременно всеми тремя.
хотя вот, напросилось: "человек"->"программист", "игрок", "неудачник" ->"вовочка". какие элементы теперь как распределить (данные, методы)?
человек. данные: голова, два уха. умеет спать, жрать, *рать.
программист. данные: тип ос, любимый язык. умеет создавать ошибки.
игрок. данные: размер долга. умеет проигрывать.
неудачник. данные: количество проблем. не умеет ничего.
вовочка. данные: еще немного мелочи в кармане. умеет радоваться жизни.

вроде сростается. но это если так. если бы программисту потребовалась своя голова, или вторая голова, было бы сложнее.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
21.07.2011, 12:22     Наследование #13
novi4ok,
класс юнит
классы войн с мечем, лучник наследуются от юнита.
класс стражник дворца - наследует свойства обоих.

класс постройка
класс дом
классы дом с верандой, дом с террасой наследуют свойства дома
класс прибережный дом наследует их обоих свойства.

да куча примеров.
rrrFer
Заблокирован
21.07.2011, 12:29     Наследование #14
novi4ok, опять же, у Страуструпа есть пример Что за пример не помню, но из реальной жизни взят вроде бы(стояла зада, он там описывает как удачно ее решили множественным наследованием). Хотя, ИМХО редко такие примеры бывают
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.07.2011, 19:15     Наследование #15
Цитата Сообщение от OstapBender Посмотреть сообщение
класс юнит
классы войн с мечем, лучник наследуются от юнита.
класс стражник дворца - наследует свойства обоих.
пример неполноценный:
на фига нам вообще класс юнит, если у него ничего нет, и он ни фига не умеет? что мы собираемся от него наследовать, кроме имени parent-класса?
хватает ли рук у стражника дворца, чтобы держать и лук, и стрелы, и меч?
Цитата Сообщение от OstapBender Посмотреть сообщение
класс постройка
класс дом
классы дом с верандой, дом с террасой наследуют свойства дома
класс прибережный дом наследует их обоих свойства.
и дом с террасой, и с верандой напрашиваются на aggregation скорее, чем на inheritance
Цитата Сообщение от OstapBender Посмотреть сообщение
да куча примеров.
допускаю, но ты ни одного иллюстративного не привел

Добавлено через 1 минуту
Цитата Сообщение от rrrFer Посмотреть сообщение
...как удачно ее решили множественным наследованием). Хотя, ИМХО редко такие примеры бывают
примерно так я тоже считаю. сколько ни приходилось видеть таких конструкций, все выглядели искусственно, и не соответствовали тому, что они должны были отображать. потому создавали скорее доп. сложности, чем упрощали решение задачи.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2011, 19:40     Наследование
Еще ссылки по теме:

Наследование - C++
Используя механизм наследования реализовать иерархию: Окружность –&gt; Цилиндр. У базового класса присутствуют методы: конструктор, вычисление...

наследование - C++
добрый день, вопрос в следующем : #include &lt;iostream&gt; using namespace std; class A{ public: int foo(){...

Наследование - C++
На языке С++ описать модель данных для вычисления площадей и периметров геометрических фигур на плоскости: треугольников и прямоугольников....

Наследование - C++
Какой практический смысл private-наследования? (Понятно, что это инкапсуляция базового класса)


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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.07.2011, 19:40     Наследование #16
Цитата Сообщение от novi4ok Посмотреть сообщение
на фига нам вообще класс юнит
Абстрактный базовый. Содержит, например, виртуальные функции "Атаковать", "Идти", "Прятаться" и т.д. За счёт него мы сможем выделить всех бойцов рамкой и заставить их атаковать или идти.
Yandex
Объявления
21.07.2011, 19:40     Наследование
Ответ Создать тему
Опции темы

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