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

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

Войти
Регистрация
Восстановить пароль
 
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
#1

Создание нового экземпляра дочернего класса из экземпляра базового - C++

27.05.2014, 03:04. Просмотров 857. Ответов 17
Метки нет (Все метки)

Всем привет!
Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него...
У меня есть несколько классов: все они рисуют графику кроме одного, который просчитывает физику.
Таким образом, этому классу для просчет физики, постоянно будут требоваться данные из остальных классов, которые рисуют.
Я быстро вспомнил про наследование, отнаследовал пару классов рисовки для класса фикизики и ... впал в ступор. Оказывается, я не могу создать новый экземпляр дочернего физического класса на основе уже созданных рисовальных классов! Я могу создать только пустой дочерний физический класс (который мне вообще не сдался, без информации в нем).
Отсюда вопросы:
1) Есть ли возможность в Си++ создавать дочерний класс из множества уже существующих экземпляров базовых классов?
2) Я так думаю, что Си не был бы Си, если бы такую штуку провернуть было нельзя, поэтому следующий вопрос: а как это сделать?
Буду очень благодарен за ссылки на конкретный пример или любую помощь и разъяснения =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2014, 03:04     Создание нового экземпляра дочернего класса из экземпляра базового
Посмотрите здесь:

C++ Сложение экземпляра базового класса и экземпляра наследника
Создание экземпляра класса C++
C++ Создание экземпляра для наследника абстрактного класса
C++ Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?
C++ Создание экземпляра класса в массиве без объявления имени
Явное создание экземпляра класса и явная специализация шаблона класса C++
C++ Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4919 / 4257 / 1425
Регистрация: 14.04.2014
Сообщений: 16,737
27.05.2014, 09:06     Создание нового экземпляра дочернего класса из экземпляра базового #2
Если вопрос о множественном наследовании, то да, есть такое.
zss
Модератор
Эксперт С++
6244 / 5847 / 1891
Регистрация: 18.12.2011
Сообщений: 14,980
Завершенные тесты: 1
27.05.2014, 09:14     Создание нового экземпляра дочернего класса из экземпляра базового #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
public:
    void f(){cout<<"base A\n";}
};
class B
{
public:
    void f(){cout<<"base B\n";}
};
class C:public A,public B
{
public:
   void f(){cout<<"from C\n";}
};
int main()
{
    C c;
    c.f(); // from C
    c.A::f(); //from A
    c.B::f(); //from B
}
ValeryS
Модератор
6508 / 4974 / 459
Регистрация: 14.02.2011
Сообщений: 16,476
27.05.2014, 09:23     Создание нового экземпляра дочернего класса из экземпляра базового #4
Цитата Сообщение от Divergence Посмотреть сообщение
Создание нового экземпляра дочернего класса из экземпляра базового
нет нельзя
экземпляр это объект
если тебе нужно создать новый класс который наследует несколько родителей то zss, показал как
Jewbacabra
Эксперт PHP
2114 / 1778 / 655
Регистрация: 24.04.2014
Сообщений: 5,098
27.05.2014, 09:55     Создание нового экземпляра дочернего класса из экземпляра базового #5
Цитата Сообщение от Divergence Посмотреть сообщение
Оказывается, я не могу создать новый экземпляр дочернего физического класса на основе уже созданных рисовальных классов!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
public:
A(const A& a) {
// копирование всех данных из a
};
class B {
public:
B(const B& b) {
// копирование всех данных из b
};
};
 
class C: public A, B {
public:
C(const A& a, const B& b): A(a), B(b) {
 
}
};
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
28.05.2014, 00:13  [ТС]     Создание нового экземпляра дочернего класса из экземпляра базового #6
Цитата Сообщение от zss Посмотреть сообщение
1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
public:
* * void f(){cout<<"base A\n";}
};
class B
{
public:
void f(){cout<<"base B\n";}
};
class C:public A,public B
{
public:
void f(){cout<<"from C\n";}
};
int main()
{
C c;
c.f(); // from C
c.A::f(); //from A
c.B::f(); //from B
}
Спасибо за ответ, но данный пример - стандартен. Мне нужны не только тела функций, но уже инициализированные и объявленные переменные из класса...

Цитата Сообщение от Jewbacabra Посмотреть сообщение
1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A {
public:
A(const A& a) {
// копирование всех данных из a
};
class B {
public:
B(const B& b) {
// копирование всех данных из b
};
};
class C: public A, B {
public:
C(const A& a, const B& b): A(a), B(b) {
}
};
Жесткий пример для меня...
Можете немного дообъяснять мне что конкретно происходит?
Хотел написать сюда длинный пример, но решил что лучше ограничиться простыми вопросами:
1) Зачем использовать const при передаче переменных класса конструктору класса?
C++
1
B(const B& b) {
Можно ли обойтись без const и чем это грозит?
2) Зачем добавлять конструкторы после функции копирования данных из класса?
C++
1
C(const A& a, const B& b): A(a), B(b)
Могу ли я просто написать
C++
1
C(const A& a, const B& b) { }
? Положив во внутрь ссылки от существующих классов.
Буду ОООООЧЕНЬ благодарен за разъяснения
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.05.2014, 00:24     Создание нового экземпляра дочернего класса из экземпляра базового #7
Цитата Сообщение от Divergence Посмотреть сообщение
У меня есть несколько классов: все они рисуют графику кроме одного, который просчитывает физику.
Таким образом, этому классу для просчет физики, постоянно будут требоваться данные из остальных классов, которые рисуют.
Я быстро вспомнил про наследование, отнаследовал пару классов рисовки для класса фикизики и ...
и сделал какашку.
сделай один класс который хранит чисто данные и ничего не делает.
подавай объект этого класса на вход рисовальщику и на вход тому кто считает физику.
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
28.05.2014, 00:36  [ТС]     Создание нового экземпляра дочернего класса из экземпляра базового #8
и сделал какашку.
сделай один класс который хранит чисто данные и ничего не делает.
подавай объект этого класса на вход рисовальщику и на вход тому кто считает физику.
Я думал об этом.
Проблема в том, что если я не опущу руки и продолжу писать проект, то он скоро разрастется до неимоверных масштабов. А контролировать один громадный класс, лично для меня, намного сложнее, чем контролировать несколько небольших классов.
У меня нет опыта в разработке больших проектов, однако когда размер кода вырос до такого размера, что я уже не смог полностью держать все алгоритмы в голове, я отчетливо понял, что трата времени на правильное начальное проектирование, это единственное спасение от провала.
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
28.05.2014, 05:28     Создание нового экземпляра дочернего класса из экземпляра базового #9
Цитата Сообщение от Divergence Посмотреть сообщение
А контролировать один громадный класс, лично для меня, намного сложнее, чем контролировать несколько небольших классов.
А где предлагают делать один большой класс? Классов, которые хранят данные, понятно, будет несколько. Расчет физики, наверное, тоже декомпозируется.
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
28.05.2014, 11:17     Создание нового экземпляра дочернего класса из экземпляра базового #10
Цитата Сообщение от Divergence Посмотреть сообщение
Есть ли возможность в Си++ создавать дочерний класс из множества уже существующих экземпляров базовых классов?
К сожалению, вы пока плохо представляете что такое наследование и ООП. Наследование - это наследование типов, а не объектов, т.е. при наследовании тип-потомок наследует свойства типа-предка, а не объект-потомок наследует данные объекта-предка.
Открытое наследование реализует концепцию "является разновидностью", т.е. объект класса-наследника является одновременно и объектом класса-предка, плюс обладает еще какими-то свойствами. Т.е. если вы унаследуете как намереваетесь, то огромный класс и получите.
Обмен данными никакого отношения к наследованию не имеет.
Если проект у вас действительно большой, то без ООП вам не обойтись, так что стоит его подучить, чтобы спроектировать грамотно, а то вся работа будет впустую.

Добавлено через 7 минут
Несколько удивляет, что поголовно все студенты называют объекты "экземплярами". Неужели существуют учебники, с таким термином?
0x10
28.05.2014, 13:33
  #11

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
Несколько удивляет, что поголовно все студенты называют объекты "экземплярами". Неужели существуют учебники, с таким термином?
А что с ним не так? Открываем английскую вики (http://en.wikipedia.org/wiki/Object-...ed_programming):
"Objects, which are usually instances of classes, ...", где instance переводится как "экземпляр".

Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
28.05.2014, 13:55     Создание нового экземпляра дочернего класса из экземпляра базового #12
Цитата Сообщение от 0x10 Посмотреть сообщение
Открываем английскую вики (http://en.wikipedia.org/wiki/Object-...ed_programming):
"Objects, which are
Вы совершенно правы, и в русских, и в английских учебниках данная сущность называется объектом, поэтому непонятно откуда идет это загаживание терминологии.
ValeryS
Модератор
6508 / 4974 / 459
Регистрация: 14.02.2011
Сообщений: 16,476
28.05.2014, 23:09     Создание нового экземпляра дочернего класса из экземпляра базового #13
Цитата Сообщение от 0x10 Посмотреть сообщение
где instance переводится как "экземпляр".
ты уж полностью переводи
instances of classes экземпляры классов или классные(классовые) экземпляры
сиречь объекты
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
29.05.2014, 00:45  [ТС]     Создание нового экземпляра дочернего класса из экземпляра базового #14
Мне кажется, слово экземпляр намного более точное, чем объект. Так, например, под словосочетанием "объект класса" может подразумеваться не только сам объявленный и созданный класс, но и один конкретный объект внутри этого класса. А вот с "экземпляр класса" вообще никакого недопонимания нет.
ValeryS
Модератор
6508 / 4974 / 459
Регистрация: 14.02.2011
Сообщений: 16,476
29.05.2014, 01:02     Создание нового экземпляра дочернего класса из экземпляра базового #15
Цитата Сообщение от Divergence Посмотреть сообщение
Так, например, под словосочетанием "объект класса" может подразумеваться не только сам объявленный и созданный класс,
класс не может создаваться, это описание
создаваться может объект
и не обязательно класса например объект структуры
есть описание структуры оно одно а объектов этой структуры может быть много
тоже самое и с классами
Цитата Сообщение от Divergence Посмотреть сообщение
но и один конкретный объект внутри этого класса.
внутри класса нет объектов
есть члены и функции-члены, которые называют методами
Цитата Сообщение от Divergence Посмотреть сообщение
А вот с "экземпляр класса" вообще никакого недопонимания нет.
судя по вопросу который здесь прозвучал, этого не скажешь
из-за путаницы в терминологии и получается непонимание принципов ООП
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
29.05.2014, 04:16     Создание нового экземпляра дочернего класса из экземпляра базового #16
Цитата Сообщение от Divergence Посмотреть сообщение
сам объявленный и созданный класс
Вот из вашего-то сообщения как раз и видно, что эти «экземпляры» только засоряют людям мозги.
Класс – это некий текст в программе, описывающий какой-то тип. А объект – это область памяти компьютера, в которой хранятся данные этого типа.

Большой толковый словарь
ЭКЗЕМПЛЯР, -а; м. [от лат. exemplar - образец]

Экземпляр — копия, оттиск, отпечаток; образец, пример; единица; тип, экземплярчик, индивидуум, индивид, особь, прима, штука, предмет, секунда
dic.academic.ru › Словарь русских синонимов

А «экземпляр класса» это по смыслу вроде бы тоже класс, какой-то образец или пример класса, т.е. текста.
0x10
29.05.2014, 05:20
  #17

Не по теме:

Теминологический спор - всегда бессмысленный и беспощадный.
Открываю Липпмана: "Одни программисты используют термин "объект" лишь для переменных и экземпляров классов."

Цитата Сообщение от Mr.X Посмотреть сообщение
Экземпляр — копия, оттиск, отпечаток; образец, пример; единица; тип, экземплярчик, индивидуум, индивид, особь, прима, штука, предмет, секунда
В моем понимании "предмет" и "объект" если не полностью синонимичны, то достаточно близки.
За сим со своей стороны оффтоп прекращаю.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2014, 06:48     Создание нового экземпляра дочернего класса из экземпляра базового
Еще ссылки по теме:

C++ Создание экземпляра класса до определения класса
Создание экземпляра класса из DLL C++
C++ При создании экземпляра класса, создается 2 экземпляра вместо 1
Создание экземпляра шаблона класса C++
Предотвратить создание экземпляра класса C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6508 / 4974 / 459
Регистрация: 14.02.2011
Сообщений: 16,476
29.05.2014, 06:48     Создание нового экземпляра дочернего класса из экземпляра базового #18
0x10,
так главное то в терминологии чтобы тебя другие поняли, ну и ты их
примеры из жизни
"Сканер" у компьютерщиков прибор для оцифровки изображений
у осветителей светодинамический прибор
одно слово две сущности, и мне когда слышу "сканер" приходится уточнять с кем я разговариваю
В телевидении, где я раньше работал, осветительные приборы назвались "киловатки" "пятисотки", от мощности лампы
В театре,эти же приборы называют "сишки", от названия лампы "СИ"
один предмет два имени
Yandex
Объявления
29.05.2014, 06:48     Создание нового экземпляра дочернего класса из экземпляра базового
Ответ Создать тему
Опции темы

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