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

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

Восстановить пароль Регистрация
 
Penoplast
3 / 3 / 1
Регистрация: 14.09.2012
Сообщений: 84
20.11.2012, 01:43     Наследование #1
Подскажите пожалуйста, имеется вот такая схемка связей, прошу прощения за свое рисование: click
(стрелки это наследование, где стрелка, тот класс более абстрактен).

C++
1
2
3
4
5
6
7
8
class A
{
public:
    int getData();
    virtual void Ololo() = 0;
private:
    int data;
};
C++
1
2
3
4
5
6
7
8
class B : public A
{
public:
    void setN(int num);
    virtual void Ololo() {/*Реализация*/ }
private:
    int n;
};
Будет ли у классов AB1, AB2, AB3 две копии методов данных от классов A и B, и что будет с реализованной в классе В абстрактной функцией Ololo() в этих классах? И правильно ли так делать? Если не правильно то как можно исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2012, 01:43     Наследование
Посмотрите здесь:

Наследование C++
Наследование C++
C++ Наследование
C++ Наследование
C++ наследование С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
20.11.2012, 02:04     Наследование #2
Правильно ли с точки зрения проектирования? вам виднее, что за объекты и как вы с ними работаете
Будет ли это работать? вполне
Про две копии методов не очень понял. Если классы AB1, AB2, AB3 перегрузят какой-то метод, то будет вызываться он. Если нет, то будет вызываться метод класса В. Если и у класса В этого метода нет, то метод класса А. Если и там нет реализации, то классы AB1, AB2, AB3 станут абстрактными
Penoplast
3 / 3 / 1
Регистрация: 14.09.2012
Сообщений: 84
20.11.2012, 14:50  [ТС]     Наследование #3
Цитата Сообщение от I.M. Посмотреть сообщение
Про две копии методов не очень понял.
То есть например вызов getData() в каком классе изменит переменную data?
Нужно для этого использовать A::getData() или B::getData()? Или же присутствует только одна такая переменная?
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
20.11.2012, 15:14     Наследование #4
а вас не смущает что вы используете только наследование? почитайте про другие отношения между классами. скорее всего нужно активнее использовать композицию. реализация и наследование это разные отношения.
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
20.11.2012, 15:20     Наследование #5
То, что на рисунке - это классический пример ромбовидного наследования. Нужно будет указывать путь наследования, чтобы вызвать getData(). Лучше перепроектировать. Или использовать виртуальное наследование.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
20.11.2012, 15:25     Наследование #6
в продолжении темы ещё ссылку вспомнил Виртуальное наследование
ну и для таких схем классов, есть диаграмма классов UML. Вам бы не пришлось пояснять мне как там обозначается наследование.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
20.11.2012, 16:24     Наследование #7
Penoplast, такая переменная будет только одна.
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
20.11.2012, 17:51     Наследование #8
Цитата Сообщение от I.M. Посмотреть сообщение
такая переменная будет только одна.
Если речь о переменной data, то их в памяти будет две.
Например, для AB1 на приложенном графе наследования - это A1::data и B::data. Если без виртуального наследования.
Разве нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2012, 18:18     Наследование
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
20.11.2012, 18:18     Наследование #9
WhiteP, я говорил про обычный вариант наследования, без всяких конфликтов.
В случае ромбовидного не виртуального наследования вы правы.
Yandex
Объявления
20.11.2012, 18:18     Наследование
Ответ Создать тему
Опции темы

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