Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

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

23.09.2014, 13:11. Просмотров 851. Ответов 11
Метки нет (Все метки)

никак не разберусь с наследованием, у нас тут в методичке дана по нему общая инфа, надо сделать как в методичке, но так не получается... выдает ошибку вот что написано в методичке:

Кликните здесь для просмотра всего текста
В описании класса можно указать список базовых классов с помощью следующего синтаксиса:
class <Имя класса> : <Список базовых классов> {
}

<Список базовых классов>:
[<Спецификатор доступа>] [virtual] <Имя класса>
Конструкция имя-класса в «списке базовых» должна обозначать ранее описанный класс, который называется базовым по отношению к определяемому классу. Говорят, что класс является производным от своих базовых классов. К членам базового класса, если только они не переопределены в производном классе, можно обращаться так, как будто они являются членами производного класса. Говорят, что производный класс наследует члены базового класса.
Пример:
class Base {
public:
int a;
};

class Derived : public Base {
public:
int b, c;
};
Класс называется прямым базовым, если он находится в списке-базовых. Класс называется косвенным базовым, если он сам не являясь прямым базовым, служит базовым для одного из классов списка-базовых (является базовым для одного из базовых).


с первым способом все ясно, а вот "<Список базовых классов>: [<Спецификатор доступа>] [virtual] <Имя класса>" я не нашел такого даже у Страуструпа... что это за странный метод наследования??? у меня такое выдает ошибки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2014, 13:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование классов (C++):

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Наследование классов. Копирование производных классов - C++
Здравствуйте всем, у меня такой вопрос: написал код #include &quot;stdafx.h&quot; class A //Создаем класс А { int mA; ...

наследование классов - C++
Здарова, народ! :D Вот сижу и пытаюсь сделать задание из книги по которой &quot;учимся программировать в универе&quot;, а там такой поворот...

наследование классов - C++
Народ, всем приветик! Уже 3 день сижу над етой темой, не получается задание, вчера выбрасывал на форум исходник, но в конце концов сделал...

Наследование классов - C++
Доброго времени суток. Обращаюсь за помощью к Вам. Язык С++ стал изучать недавно и столкнулся вот с такой проблемой: Рассмотрим класс...

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

11
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,286
Записей в блоге: 2
Завершенные тесты: 1
23.09.2014, 13:27 #2
Виртуальное наследование
2
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
23.09.2014, 14:22  [ТС] #3
Dani, спс, вроде то что нужно... короче походу в методичке у нас че то напутано... там вообще в этом варианте не стоит слово class, а имя нового класса идет после списка базовых классов... бред какой то...
0
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
23.09.2014, 16:03 #4
Цитата Сообщение от GetHelp Посмотреть сообщение
с первым способом все ясно
И этот способ является единственным.
Цитата Сообщение от GetHelp Посмотреть сообщение
"<Список базовых классов>: [<Спецификатор доступа>] [virtual] <Имя класса>"
Это просто пояснение к тому, что написано выше. Виртуальное наследование тут не причём.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 16:11 #5
Цитата Сообщение от GetHelp Посмотреть сообщение
а вот "<Список базовых классов>: [<Спецификатор доступа>] [virtual] <Имя класса>" я не нашел такого даже у Страуструпа...
Страуструп.
0
Миниатюры
Наследование классов  
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
23.09.2014, 16:13  [ТС] #6
Цитата Сообщение от John Prick Посмотреть сообщение
И этот способ является единственным.
Цитата Сообщение от John Prick Посмотреть сообщение
Это просто пояснение к тому, что написано выше. Виртуальное наследование тут не причём.
там же написано
Класс называется прямым базовым, если он находится в списке-базовых. Класс называется косвенным базовым, если он сам не являясь прямым базовым, служит базовым для одного из классов списка-базовых (является базовым для одного из базовых).
так что 2 вида...

Добавлено через 41 секунду
Цитата Сообщение от alsav22 Посмотреть сообщение
Страуструп.
хз может у нас разные издания?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.09.2014, 16:24 #7
Цитата Сообщение от GetHelp Посмотреть сообщение
хз может у нас разные издания?
Это в любом издании будет (так же, как и в любом учебнике).
0
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
23.09.2014, 16:28 #8
Цитата Сообщение от GetHelp Посмотреть сообщение
так что 2 вида...
По синтаксису - 1 вид. То, что ты процитировал - это просто объяснение, как класс может фактически наследовать от другого.
C++
1
2
3
4
5
class A {};
class B: public A {};
class C {};
class D: public B, private С {};
// и т.д.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
23.09.2014, 19:35  [ТС] #9
помогите правильно сделать наследование, значит задание такое:
Кликните здесь для просмотра всего текста
Лабораторное задание
Лабораторная работа выполняется на базе работы №3.
Необходимо разработать не менее 3 производных классов. Каждый производный класс должен расширять базовый. В каждый производный класс необходимо добавить переменные и функции, уточняющие базовый класс.
Структура классов должна быть следующей:
– Base : Derived1
– Base : Derived2
– Derived2 : Derived3
В качестве базового класс Base берется класс, разработанный в лабораторной работе №3. Производные классы Derived1 и Derived2 должны быть пронаследованы от базового класса. Класс Derived3 должен быть пронаследован от производного класса Derived2.
Во всех производных классах Derived1, Derived2 и Derived3 должны быть реализованы два метода: Input и Output. Методы должны использовать вызовы из родительского класса. Т.е. в производном классе в функциях первоначально должны быть вызваны функции базового класса (для Derived1 и Derived2 функции из класса Base, для Derived3 функции из класса Derived2), а затем выполнен ввод и вывод данных текущего класса.

класс из 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
31
32
33
34
35
36
37
38
39
40
41
class town //класс населенный пункт
{
private:
    char* name; //название
    double latitude; //широта
    double longitude; //долгота
    char* transport; //виды общественного транспорта
 
    inline char* getname() { return name; }
public:
    //конструктор без параметров
    town();
    //конструктор с параметром задающим название
    town(char* _name);
    //конструктор с параметрами задающими все поля
    town(char* _name, size_t _population, char* _transport, double _latitude = 0.0, double _longitude = 0.0);
    //копирующий конструктор
    town(town& t);
    //деструктор
    ~town();
    //метод Input выполняет ввод данных из файла
    bool Input();
    //метод Output печатает на экране данные класса
    bool Output();
protected:
    size_t population; //количество жителей
 
    inline size_t getpopulation() { return population; }
};
 
class Derive1 : public town
{
};
 
class Derive2 : public town
{
};
 
class Derive3 : public virtual Derive2
{
};
я там как бы уже набросок сделал, вроде примерно так? только теперь с методами, там думаю надо сделать просто чтобы эти Input, Output из потомков как там и написано просто вызывали Input, Output из родителей, как их правильно описать? в какой секции? protected?
0
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
23.09.2014, 21:39 #10
Цитата Сообщение от GetHelp
C++
1
class Derive3 : public virtual Derive2
virtual-наследование лишено смысла здесь, так как virtual применяется при множественном ромбовидном наследовании.
Цитата Сообщение от GetHelp
C++
1
2
protected:
    size_t population; //количество жителей
Данные-члены не рекомендуется помещать в protected секцию, так как при этом нарушается принцип инкапсуляции.
Цитата Сообщение от GetHelp Посмотреть сообщение
Необходимо разработать не менее 3 производных классов. Каждый производный класс должен расширять базовый. В каждый производный класс необходимо добавить переменные и функции, уточняющие базовый класс.
Имхо, нужны классы, несущие хоть какую-то смысловую нагрузку. Например, если базовый town, то производные: village, satellite, megacity и т.д.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
23.09.2014, 21:43  [ТС] #11
Цитата Сообщение от John Prick Посмотреть сообщение
virtual-наследование лишено смысла здесь, так как virtual применяется при множественном ромбовидном наследовании.
думаю если это есть в методичке то это 100% надо использовать... у нас тут все так...
Цитата Сообщение от John Prick Посмотреть сообщение
Данные-члены не рекомендуется помещать в protected секцию, так как при этом нарушается принцип инкапсуляции.
вот прямое подтверждение кстати, я согласен с тем что это бред, но задание первой лабы требовало переменных и методов в protected области, а придумать что то более нужно там я не смог...
Цитата Сообщение от John Prick Посмотреть сообщение
Имхо, нужны классы, несущие хоть какую-то смысловую нагрузку. Например, если базовый town, то производные: village, satellite, megacity и т.д.
да пофиг скорее всего, тут главное чтобы было образец работы с наследованием, преподу до фени на смысл...
0
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
23.09.2014, 22:17 #12
Цитата Сообщение от GetHelp Посмотреть сообщение
думаю если это есть в методичке то это 100% надо использовать... у нас тут все так...
Если "методичка" это то, что ты приводил в начале, то там просто обозначен весь возможный набор ключевых слов. Не думаю, что это обязательно использовать. Тем более, что виртуальное наследование довольно редкий случай, и логически обоснованный пример так просто не изобретёшь.
0
23.09.2014, 22:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2014, 22:17
Привет! Вот еще темы с ответами:

наследование классов в C++ - C++
решил я с SDL поиграться.... ругается на 9 строчку компилятор, где ошибку допустил не подскажете?) main.cpp #include &lt;iostream&gt; ...

Наследование классов - C++
class A { public: * * A(int a){} }; class B : public A { public:

Наследование классов - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; class PARENT { public: void method1(){this-&gt;method2();}; void...

Наследование классов - C++
Доброго всем времени суток! Подскажите, куда надо положить свой базовый класс,чтобы можно было создать класс-наследник?


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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