Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141

Наследование и полиморфизм...

09.04.2012, 12:42. Показов 2268. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть спецы в этой теме?)
Сейчас пишу курсовую, в методичке (препод сильно снижает за отклонения от инструкций) сказано создать базовый класс, сделать ему 2х потомков...
хорошо сделал, но у этого класса есть интересный конструктор...

C++
1
2
3
4
5
6
7
class myclass
{
public
    myclass(data,bool T, bool V)/*data - некие параметры, 
                                          а вот T - тип объекта(при этом выбор из потомков...), 
                                           V - свойства объекта(опять же к потомком относится)...*/
};
те на сколько я понял надо сделать что-то вроде
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
class mybase;
class p1;
class p2;
 
class mybase
{
public:
    mybase(void){;}
    mybase(bool id)
    {
        mybase* tmp;
        id == true ? tmp = new p1 : tmp = new p2;
        *this = *tmp;
    }
    virtual ~mybase(void){;}
    virtual void get(void){puts("base");}
};
 
class p1: public mybase
{
public:
    p1(void){;}
    void get(void){puts("p1");}
    ~p1(void){;}
};
 
class p2: public mybase
{
public:
    p2(void){;}
    void get(void){puts("p2");}
    ~p2(void){;}
};
такое вообще возможно, ибо я этот код скомпилять не смог???О_О
пробовал разбивать на файлы в результате или базовый клас считается необъявленным, или потомки...
подскажите пожалуйста как организовать, точнее для начала возможно ли это, если да, то как?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2012, 12:42
Ответы с готовыми решениями:

Наследование и полиморфизм.
Вопрос следующий. Как мне вытащить функцию из родителя класса родителя, при условии что родителей тек. класса у меня 2! )) Запутанно? Ниже...

Наследование и полиморфизм
Написать демонстрационную программу, в которой создаются объекты различных классов. Определение классов, их реализацию, демонстрационную...

Полиморфизм, наследование
Товарищи, кто может, объясните пожалуйста. Просят добавить новый тип объектов Trap. Методы в нем объявлены как виртуальные, но в...

10
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
09.04.2012, 13:04
Цитата Сообщение от Глупец Посмотреть сообщение
class myclass
{
public
* * myclass(data,bool T, bool V)/*data - некие параметры,
* * * * * * * * * * * * * * * * * * * * * а вот T - тип объекта(при этом выбор из потомков...),
* * * * * * * * * * * * * * * * * * * * * *V - свойства объекта(опять же к потомком относится)...*/
};
Жесть какая!!! Не делай так больше.
Во первых ты вообще осознаёшь, что таким действием ты рекурсивно запускаешь бесконечный конструктор базового класса???
Потому что перед тем как сделать
mybase(bool id){ tmp = new p1}
конструктор p1 вызовется сначала вызвав конструктор своего родителя??? И мы зациклемся как минимум. А вообще, это ошибка, конечно.
Во-вторых, базовый класс вообще в большинстве случаев не должен много знать о своих потомках. Чаще всего он создаёт какой-то единый интерфейс для обращения с ними.

Добавлено через 13 минут
Но скорее всего даже до рекурсии дело не дойдёт - просто не скомпилируется
На будущее,
хочешь выбирать, что создать, в указателе, одного потомка или другого. Решай это там, где ты выделяешь под них память с помощью new
то есть
C++
1
2
3
4
5
6
7
8
int main(){
base* ptr_to unknown;
cout<<"p1 or p2?";
cin>>n;
if (n==1){base=new p2;}else{base=new p1;}
base->get();
return 0;
}
ФУНКЦИЮ GET сделай виртуальной
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 13:06  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Во первых ты вообще осознаёшь, что таким действием ты рекурсивно запускаешь бесконечный конструктор базового класса???
Потому что перед тем как сделать
mybase(bool id){ tmp = new p1}
Вообще - то мы бы вызвали пустой конструктор, на сколько я понимаю, и рекурсии бы не было....
Да, действительно, обычно базовый класс организует только общий интерфейс...

А теперь еще раз вопрос: "Точно не получится организовать нечто подобное?".
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.04.2012, 13:06
Предок не должен ничего знать о потомках.
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 13:08  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ФУНКЦИЮ GET сделай виртуальной
она виртуальная...
на вопрос ответь.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
09.04.2012, 13:12
Цитата Сообщение от Глупец Посмотреть сообщение
она виртуальная...
на вопрос ответь.
taras atavin ответил. Так не делают. Сделай просто отдельную функцию не член класса, выбора, что создавать. Конструктор не для того предназначен.
Да, пустого конструктора я не заметил
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
09.04.2012, 13:14
Так делать нельзя, всякое знание предка о потомках есть концептуальная ошибка. Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
09.04.2012, 13:15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Потому что перед тем как сделать
mybase(bool id){ tmp = new p1}
конструктор p1 вызовется сначала вызвав конструктор своего родителя
а разве не вызовется этот конструктор и всё будет нормально
C++
1
 mybase(void){;}
сорри,не заметил,что это уже написали,вопрос закрыт
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 20:41  [ТС]
Спасибо, Домовенок и Тарас.
Цитата Сообщение от taras atavin Посмотреть сообщение
Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма
ты здесь имел в виду что то вроде флага?
т.е. есть несколько классов, у базового указана какая - то переменная, являющаяся константой для потомков (для перого - 1, второго - 2...).
или метода, который возвращает подобную константу.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
09.04.2012, 20:57
Цитата Сообщение от Глупец Посмотреть сообщение
или метода, который возвращает подобную константу.
Методы возвращающие подобную константу аналогичны твоему методу virtual void get(void){puts("p1");}
То есть объект базового класса всё что теоретически может сказать - это только своё имя.
virtual int get_id(){return 1;/*признак класса base*/}
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 21:13  [ТС]
понятно, спасибо.)
хотя препод вроде шарит...чего он хотел сказать написав это в методичке...((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2012, 21:13
Помогаю со студенческими работами здесь

Наследование и полиморфизм
Добрый день ребятюни!! Срочно требуется ваша помощь! Программа которая служит для вывода выдающихся учеников и преподов. Если у...

Полиморфизм, наследование
Создать абстрактный базовый класс с виртуальной функцией*— площадь. Создать производные классы: прямоугольник, круг, прямоугольный...

Наследование, полиморфизм
Не могу реализовать полиморфизм для метода getShow() ну и в теории сетШов(). Но сейчас о гете говорим. Я создал дополнительный класс...

ООП Полиморфизм Наследование
У меня есть базовый класс и 2 производных от него класса... Как сделать, чтобы в программе я мог сделать такое обьявление: Force fc;...

Наследование и полиморфизм классов
Доброго времени суток. Суть задания определить иерархию классов; Классы - тест, экзамен, выпускной экзамен, испытание; я так...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru