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

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

09.04.2012, 12:42. Просмотров 1352. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2012, 12:42
Ответы с готовыми решениями:

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

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

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

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

10
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
09.04.2012, 13:04 2
Цитата Сообщение от Глупец Посмотреть сообщение
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  [ТС] 3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Во первых ты вообще осознаёшь, что таким действием ты рекурсивно запускаешь бесконечный конструктор базового класса???
Потому что перед тем как сделать
mybase(bool id){ tmp = new p1}
Вообще - то мы бы вызвали пустой конструктор, на сколько я понимаю, и рекурсии бы не было....
Да, действительно, обычно базовый класс организует только общий интерфейс...

А теперь еще раз вопрос: "Точно не получится организовать нечто подобное?".
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
09.04.2012, 13:06 4
Предок не должен ничего знать о потомках.
0
24 / 24 / 3
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 13:08  [ТС] 5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ФУНКЦИЮ GET сделай виртуальной
она виртуальная...
на вопрос ответь.
0
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
09.04.2012, 13:12 6
Цитата Сообщение от Глупец Посмотреть сообщение
она виртуальная...
на вопрос ответь.
taras atavin ответил. Так не делают. Сделай просто отдельную функцию не член класса, выбора, что создавать. Конструктор не для того предназначен.
Да, пустого конструктора я не заметил
0
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
09.04.2012, 13:14 7
Так делать нельзя, всякое знание предка о потомках есть концептуальная ошибка. Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма.
0
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
09.04.2012, 13:15 8
Цитата Сообщение от 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  [ТС] 9
Спасибо, Домовенок и Тарас.
Цитата Сообщение от taras atavin Посмотреть сообщение
Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма
ты здесь имел в виду что то вроде флага?
т.е. есть несколько классов, у базового указана какая - то переменная, являющаяся константой для потомков (для перого - 1, второго - 2...).
или метода, который возвращает подобную константу.
0
3269 / 2657 / 717
Регистрация: 25.03.2012
Сообщений: 9,582
Записей в блоге: 1
09.04.2012, 20:57 10
Цитата Сообщение от Глупец Посмотреть сообщение
или метода, который возвращает подобную константу.
Методы возвращающие подобную константу аналогичны твоему методу 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  [ТС] 11
понятно, спасибо.)
хотя препод вроде шарит...чего он хотел сказать написав это в методичке...((
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2012, 21:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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