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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
12.12.2012, 10:38     Наследование #1
Доброго утра всем, разъясните кто-нибудь пожалуйста как правильно разбивать программу на части? Вот предположим у меня есть класс Job, и от него наследуемый класс manager и scientist. Я знаю как реализовать наследование в одном файле, но это ведь не полное наследование. Тоесть наследование полное будет если все эти классы будут в отдельных файлах.
Вот к примеру я создал проект, у меня сейчас есть два файла job.h и job.cpp, в срр там main функция от класса job а в .h реализация самого класса.
Теперь чтобы создать новый класс с наследование я создаю новый фаил manager.h и реализую там его. Подключаю его к job.h, в job.cpp в функции main я уже поидее должен работать и с первым и с вторым. Но не выходит.
Может кто-нить привести простецкий пример наследования и полиморфизма а так же коментарии "что к чему и почему". Заранее благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2012, 10:38     Наследование
Посмотрите здесь:

C++ Наследование
Наследование C++
C++ наследование
C++ Наследование?!
C++ наследование
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.12.2012, 11:22     Наследование #2
Цитата Сообщение от Elfenlide Посмотреть сообщение
Я знаю как реализовать наследование в одном файле, но это ведь не полное наследование. Тоесть наследование полное будет если все эти классы будут в отдельных файлах.
Наследование и расположение классов в разных файлах никак не связаны.

Добавлено через 6 минут
То, о чём ты говоришь - разбиение на модули: каждый класс (или набор функций) можно выделить в отдельный модуль - интерфейс (заголовочный файл, *.h) и реализация (файл с исходным кодом, *.cpp).

Добавлено через 1 минуту
Но с наследованием это никак не связано.
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
12.12.2012, 11:31  [ТС]     Наследование #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Наследование и расположение классов в разных файлах никак не связаны.
А мне казалось что суть наследования в том чтобы сделать возможно создавать производные классы от базового, и само наследование придумали для того чтобы программист мог использовать возможности одной программыдля создания новой. Тогда можно сделать вывод что правильным наследованием будет содержание каждого класса в отдельном файле как другой отдельной программы или библиотеки.

Ладно, может я и не прав, не это главное хотя и важно с точки зрения правильного формирования вопроса. Вы ведь поняли мою проблему, это главное.
Ну и раз я не прав тогда поставлю вопрос по другому:
Каким образом можно разделить Программу в которой есть несколько классов на разные файла с сохранением наследования. Было бы замечательно увидеть простой пример с наглядным пояснением. Так же когда я спрашивал у однокурсников "зачем каждому ашнику создавать срр файл" мне ответили "так нужно". Я не понимаю этого момента. Если у меня есть класс А и от него наследуется класс В, тогда вся работа будет проходить в В срр, и для работы наследуемого класса В нужна только возможность увидеть реализацию класса А т.е нужен файл А.h, f файл срр класса А никакой реализации не содержит так как принято описывать всё в файле .h
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
12.12.2012, 11:39     Наследование #4
Цитата Сообщение от Elfenlide Посмотреть сообщение
Я знаю как реализовать наследование в одном файле, но это ведь не полное наследование.
ты можешь всю программу написать в одном файле 100500 строк но самому потом разбираться
по файлам разбивается примерно так
class1.h
C++
1
2
3
4
5
6
class1
{
public:
class1();
int n;
}
class1.c
C++
1
2
3
4
5
#include"class1.h"
class1::class1
{
n=5;
}

class2.h
C++
1
2
3
4
5
6
7
#include"class1.h"
class2:public class1
{
public:
class2();
 
}
class2.c
C++
1
2
3
4
5
#include"class2.h"
class2::class2
{
n=15;
}
main.c
C++
1
2
3
4
5
6
7
#include"class2.h"
int main()
{
class2 cl2;
 
 
}
Добавлено через 3 минуты
Цитата Сообщение от Elfenlide Посмотреть сообщение
Так же когда я спрашивал у однокурсников "зачем каждому ашнику создавать срр файл" мне ответили "так нужно". Я не понимаю этого момента.
смотри
ты написал какой нибудь класс, о тебе понравился
и ты решил использовать его в другой разработке
если будет все в одном файле, то придется переписывать все что относится к твоему классу в новый проект
а так скопировал пару файлов в новый проект и все

Добавлено через 3 минуты
Цитата Сообщение от Elfenlide Посмотреть сообщение
реализацию класса А т.е нужен файл А.h,
в заголовочном файле(А.h) только описание (заголовки)
вся реализация в срр файле
иначе если реализация в заголовочном файле и подключить его несколько раз, получишь ошибку линковшика
"функция(переменная) уже определена в другом модуле"
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
12.12.2012, 11:49     Наследование #5
Цитата Сообщение от Elfenlide Посмотреть сообщение
Так же когда я спрашивал у однокурсников "зачем каждому ашнику создавать срр файл" мне ответили "так нужно".
Раздельная компиляция. В двух словах, он (*.cpp) будет компилироваться отдельно от всего остального, в свой отдельный объектный файл (каждый *.cpp компилируется в свой). В этом случае во-первых, если не менять ни заголовочный файл, ни файл с исходным кодом, не надо заново компилировать этот модуль, можно использовать старый объектный файл; во-вторых, при изменении только этого *.cpp надо перекомпилировать только этот модуль (при изменении же *.h придётся перкомпилировать все *.cpp, в которые включён этот *.h).
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
12.12.2012, 11:55  [ТС]     Наследование #6
Всё равно не понятно\\\\Ну вот например у меня есть класс job и производный класс manager.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
job.h
class job
{
protected:
string dolzhnost;
int time; //количество часов рабочего дня
public:
getdata()
{
cin >> dolzhnost >> time;
}
showdata()
{
cout << dolzhnost << time;
}
};
Есть производный класс manager
/*manager.h*/
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
#include "Job.h"
class manager: public Job
{
   private:
   float zarplata;
   public:
   getdata()
{
getdata::Job();
cin >>zarplata;
}
showdata()
{
showdata::Job();
cout << zarplata;
}
};
//затем делаем файл cpp для manager
[B]manager.cpp[/B]
 
#include "manager.h"
 
int main(){
manager m1;
m1.getdata();
m1.showdata();
cout<<endl;
return 0;
}
получается главный фаил это manager и в его срр происходит работа сразу с двумя классами, производным и производящим. Тогда зачем делать для класса Job файл срр, ведь мне не нужно проводить с ним никакой работы отдельно. Тоесть мне не нужно определять поля этого класса отдельно так как я это делаю в вызове getdata производного класса. А если его здесь и делать то толку от пустой main функции? ведь для того что я написал если и делать срр к классу Job то он будет выглядеть вот так:
C++
1
2
3
4
5
#include "Job.h"
int main()
{
return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
12.12.2012, 13:00     Наследование #7
иначе если реализация в заголовочном файле и подключить его несколько раз, получишь ошибку линковшика
"функция(переменная) уже определена в другом модуле"
тут надо оговорить: если один файл *.cpp и сколь угодно заголовочных файлов, то проблема решается на раз- соответствующими директивами препроцессора. Но если раздельная компиляция, тогда да, можно встрять.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
12.12.2012, 13:22     Наследование #8
Цитата Сообщение от Elfenlide Посмотреть сообщение
Тогда зачем делать для класса Job файл срр, ведь мне не нужно проводить с ним никакой работы отдельно.
а если понадобится еще один наследник?
а если придется переписать реализацию?
а если создаешь библиотеку ?
Цитата Сообщение от Elfenlide Посмотреть сообщение
Тогда зачем делать для класса Job файл срр, ведь мне не нужно проводить с ним никакой работы отдельно.
я тебе сказал ты можешь писать как хочешь
только подумай о тех кто будет сопровождать твою программу
как думаешь почему люди пришли к разным файлам( объектам компиляции)

Цитата Сообщение от Elfenlide Посмотреть сообщение
А если его здесь и делать то толку от пустой main функции? ведь для того что я написал если и делать срр к классу Job то он будет выглядеть вот так:
C++
1
2
3
4
5
#include "Job.h"
int main()
{
return 0;
}
а здесь ты можешь смело выкинуть
C++
1
#include "Job.h"
и ничего не изменится
ибо ты не создаешь объектов класса Job
и никаких обращений к классу не производишь

макрос #include ничего не подключает он грубо говоря подменяет
т.е компилятор видя этот макрос подставит на его место содержимое файла Job.h

Добавлено через 8 минут
Цитата Сообщение от kravam Посмотреть сообщение
тут надо оговорить: если один файл *.cpp и сколь угодно заголовочных файлов, то проблема решается на раз
тем кто знает да
а кто не знает

сам иногда влетаю, хотя знаю очень хорошо
описать глобальную переменную которую должны видеть все

global.h
C++
1
2
#pragma once 
int m;
1.cpp
C++
1
#include "global.h"
2.cpp
C++
1
#include "global.h"
и все и получил ......
кучу ошибок
хотя знаю прекрасно что нужно писать

global.h
C++
1
2
#pragma once 
extern int m;
1.cpp
C++
1
2
#include "global.h"
int m;
2.cpp
C++
1
#include "global.h"
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
12.12.2012, 13:46     Наследование #9
Внимание! Щас я попытаюсь на пальцах объяснить ТС, зачем нужно писать реализацию класса в *.cpp; собсно, уже сказали, но я попытаюсь другими словами.

Как тебе уже тут сказали, НИКТО не запрещает тебе писать реализацию в *.h, я так и делаю кстати, никаких проблем. Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>
#include <stdio.h>
#include "first.h"
 
int main(void) {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 foo f;
 getchar ();
 return 0;
}
C++
1
2
3
4
5
6
7
/* first.h */
 
class foo {
 public:
 foo () {printf ("создание объекта класса foo");};
 ~foo () {};
};
+++++++++++++++++++++++++++++++++++++++++++++++++

Вопрос: (задан уже) Ответ: выносить реализацию в отдельный *.cpp файл нужно вовсе не для удобства чтения, олично всё читается и в *.h файле; но для БЫСТРОТЫ компиляции. Надеюсь, ТС понимает, что если класс foo разрастётся, то компилить эту прогу будет всё дольше и дольше. А теперь представь себе, что компиляция происходит долго, а ты изменения проделываешь все с функцией main, то есть класс foo у тебя неизменен, изменяется раз от разу только main и каждый раз ты это класс ПЕРЕКОМПИЛИРУЕШЬ и ждёшь... Долго и муторно, знаешь ли.

Вот и придумали люди- может как-то класс отдельно компилить? А потом присоединят к main. И ты знаешь у них получилось. Придумали такую штуку как раздельная компиляция. ДЛя неё-то и нужно выносить реализацию класса в *.cpp файл:

C++
1
2
3
#include <stdio.h>
#include "first.h"
foo::foo () {printf ("создание объекта класса foo");};
C++
1
2
3
4
5
class foo {
 public:
 foo () ;
 ~foo () {};
};
Теперь компиль этот файл, но ОПРЕДЕЛЁНЫМ образом. Вот так:
C++
1
g++ -Wall -c first.cpp
Результат- файл first.o; тот же экзешник, но другого формата

теперь можешь смело изменять функцию main, компилить main.cpp и "присоединять" файл first.o, всё произойдёт гораздо быстрее, нежели бы first.o не было:

C++
1
g++ -Wall main.cpp first.o
До новых встреч!

тут подробнее и по фиг, что там линукс
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
12.12.2012, 18:29  [ТС]     Наследование #10
В общем из того что сказано\написано я понял вот что:
Если у меня скажем есть полностью реализованный класс который у меня хорошо работает и он мне нравится, то чтобы его не компилировать постоянно как кусок новой программы, благодаря срр файлу этот кусок скомпилируется и будет уже готовый скомпилированный лежать, я в классах наследниках модернизирую то что хочется сильно и в итоге просто к созданному объекту(производящему классу который уже не требует заново компиляции а уже готовый как объект) дополняется что-то. В итоге сокращается время компиляции так как время за компиляцию job.h manager.h и manager.cpp потребуется больше чем если бы ещё был job.cpp....
Так же если я создаю программу, то мне нужно для каждого ашника делать свой срр но main функции в них быть не должно, а для того чтобы был main() нужно сделать отдельный срр в который поставить инклюды, и тогда уже с main управлять из этого главного файла.Я правильно понял?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
12.12.2012, 20:10     Наследование #11
Цитата Сообщение от Elfenlide Посмотреть сообщение
В общем из того что сказано\написано я понял вот что:
Если у меня скажем есть полностью реализованный класс который у меня хорошо работает и он мне нравится, то чтобы его не компилировать постоянно как кусок новой программы, благодаря срр файлу этот кусок скомпилируется и будет уже готовый скомпилированный лежать, я в классах наследниках модернизирую то что хочется сильно и в итоге просто к созданному объекту(производящему классу который уже не требует заново компиляции а уже готовый как объект) дополняется что-то. В итоге сокращается время компиляции так как время за компиляцию job.h manager.h и manager.cpp потребуется больше чем если бы ещё был job.cpp....
да, так. Только при раздельной компиляции ты компилишь main.cpp+ инклуды+ *.o не забудь!

Цитата Сообщение от Elfenlide Посмотреть сообщение
Так же если я создаю программу, то мне нужно для каждого ашника делать свой срр
говорил- говорил и всё как в прорву,я кому это писал:
C++
1
НИКТО не запрещает тебе писать реализацию в *.h
?

Цитата Сообщение от Elfenlide Посмотреть сообщение
для того чтобы был main() нужно сделать отдельный срр в который поставить инклюды, и тогда уже с main управлять из этого главного файла.Я правильно понял?
правильно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 00:41     Наследование
Еще ссылки по теме:

C++ Заменить наследование классов на наследование интерфейсов
наследование C++
Наследование наследование ) C++

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

Или воспользуйтесь поиском по форуму:
Elfenlide
23 / 23 / 1
Регистрация: 15.04.2012
Сообщений: 183
13.12.2012, 00:41  [ТС]     Наследование #12
Цитата Сообщение от kravam Посмотреть сообщение
говорил- говорил и всё как в прорву,я кому это писал:
Код C++
1
НИКТО не запрещает тебе писать реализацию в *.h
Ну это само собой, просто я имел ввиду "как лучше делать".
Спасибо!
Yandex
Объявления
13.12.2012, 00:41     Наследование
Ответ Создать тему
Опции темы

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