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

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

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

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

20.11.2012, 01:43. Просмотров 366. Ответов 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++
#include <iostream> #include <assert.h> using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование - C++
char* Texts :: SetBit() { char a; int b; cout << "Получаем битовую строку" << endl; cin >> a; b = strlen(a);...

наследование - C++
Пытаюсь разобраться в наследовании Есть класс class File { public: struct comp { char num; // Имя переменной char st;...

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

наследование - C++
определить базовый класс ''точка''. Затем от него определить два произвольных класса ''прямоугольник'' и ''параллелепипед'', в каждом из...

Наследование?! - C++
привет всем. Есть класс Circle c1, c2, c3 Нужно реализовать через наследование класс множество, прошу помочь как он будет выглядеть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Антикодер
671 / 572 / 28
Регистрация: 15.09.2012
Сообщений: 2,519
20.11.2012, 15:14 #4
а вас не смущает что вы используете только наследование? почитайте про другие отношения между классами. скорее всего нужно активнее использовать композицию. реализация и наследование это разные отношения.
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
20.11.2012, 15:20 #5
То, что на рисунке - это классический пример ромбовидного наследования. Нужно будет указывать путь наследования, чтобы вызвать getData(). Лучше перепроектировать. Или использовать виртуальное наследование.
XRuZzz
Антикодер
671 / 572 / 28
Регистрация: 15.09.2012
Сообщений: 2,519
20.11.2012, 15:25 #6
в продолжении темы ещё ссылку вспомнил Виртуальное наследование
ну и для таких схем классов, есть диаграмма классов UML. Вам бы не пришлось пояснять мне как там обозначается наследование.
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. Если без виртуального наследования.
Разве нет?
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
20.11.2012, 18:18 #9
WhiteP, я говорил про обычный вариант наследования, без всяких конфликтов.
В случае ромбовидного не виртуального наследования вы правы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2012, 18:18
Привет! Вот еще темы с ответами:

наследование - C++
Как наследовать классы с использованием виртуальных функций? Можете привести пример?

наследование в С++ - C++
Добрый вечер. относительно недавно мною была получена задача, а точнее несколько задач в одной...И как это ни печально звучит, проблемы...

наследование - C++
помогите пожалуйсто дописать класс многоугольников , и рисовать на монитор с помощью mfc , заранее благодарен... class figure{ public: ...

Наследование в C++ - C++
Прошу помощи, ибо С++ не моё, а лабораторные работы девушке сдавать надо: Создать 1 базовый класс и несколько производных. Все...


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

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

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