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

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

Войти
Регистрация
Восстановить пароль
 
Penoplast
3 / 3 / 1
Регистрация: 14.09.2012
Сообщений: 84
#1

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

20.11.2012, 01:43. Просмотров 350. Ответов 8
Метки нет (Все метки)

Подскажите пожалуйста, имеется вот такая схемка связей, прошу прощения за свое рисование: 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++ наследование
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
Антикодер
614 / 515 / 26
Регистрация: 15.09.2012
Сообщений: 2,457
20.11.2012, 15:14     Наследование #4
а вас не смущает что вы используете только наследование? почитайте про другие отношения между классами. скорее всего нужно активнее использовать композицию. реализация и наследование это разные отношения.
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
20.11.2012, 15:20     Наследование #5
То, что на рисунке - это классический пример ромбовидного наследования. Нужно будет указывать путь наследования, чтобы вызвать getData(). Лучше перепроектировать. Или использовать виртуальное наследование.
XRuZzz
Антикодер
614 / 515 / 26
Регистрация: 15.09.2012
Сообщений: 2,457
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
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
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++ 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     Наследование
Ответ Создать тему
Опции темы

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