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

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

Войти
Регистрация
Восстановить пароль
 
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
#1

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

09.04.2012, 12:42. Просмотров 829. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 12:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование и полиморфизм... (C++):

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

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

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

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

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

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

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

А теперь еще раз вопрос: "Точно не получится организовать нечто подобное?".
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 13:06 #4
Предок не должен ничего знать о потомках.
0
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 13:08  [ТС] #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ФУНКЦИЮ GET сделай виртуальной
она виртуальная...
на вопрос ответь.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
09.04.2012, 13:12 #6
Цитата Сообщение от Глупец Посмотреть сообщение
она виртуальная...
на вопрос ответь.
taras atavin ответил. Так не делают. Сделай просто отдельную функцию не член класса, выбора, что создавать. Конструктор не для того предназначен.
Да, пустого конструктора я не заметил
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 13:14 #7
Так делать нельзя, всякое знание предка о потомках есть концептуальная ошибка. Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма.
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.04.2012, 13:15 #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Потому что перед тем как сделать
mybase(bool id){ tmp = new p1}
конструктор p1 вызовется сначала вызвав конструктор своего родителя
а разве не вызовется этот конструктор и всё будет нормально
C++
1
 mybase(void){;}
сорри,не заметил,что это уже написали,вопрос закрыт
0
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 20:41  [ТС] #9
Спасибо, Домовенок и Тарас.
Цитата Сообщение от taras atavin Посмотреть сообщение
Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма
ты здесь имел в виду что то вроде флага?
т.е. есть несколько классов, у базового указана какая - то переменная, являющаяся константой для потомков (для перого - 1, второго - 2...).
или метода, который возвращает подобную константу.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
09.04.2012, 20:57 #10
Цитата Сообщение от Глупец Посмотреть сообщение
или метода, который возвращает подобную константу.
Методы возвращающие подобную константу аналогичны твоему методу virtual void get(void){puts("p1");}
То есть объект базового класса всё что теоретически может сказать - это только своё имя.
virtual int get_id(){return 1;/*признак класса base*/}
0
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 21:13  [ТС] #11
понятно, спасибо.)
хотя препод вроде шарит...чего он хотел сказать написав это в методичке...((
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 21:13
Привет! Вот еще темы с ответами:

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

Классы / наследование / полиморфизм - C++
Решите, если несложно, программа вроде довольно простая..., но с с++, я пока неочень... Добавлено через 36 минут вот что я...

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

Полиморфизм инкапсуляция и наследование(ООП) - C++
Не как не могу понять зачем нужен Полиморфизм и инкапсуляция и их определение может вы подскажите, наследования я знаю


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
09.04.2012, 21:13
Ответ Создать тему
Опции темы

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