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

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

Восстановить пароль Регистрация
 
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 12:42     Наследование и полиморфизм... #1
Есть спецы в этой теме?)
Сейчас пишу курсовую, в методичке (препод сильно снижает за отклонения от инструкций) сказано создать базовый класс, сделать ему 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){;}
};
такое вообще возможно, ибо я этот код скомпилять не смог???О_О
пробовал разбивать на файлы в результате или базовый клас считается необъявленным, или потомки...
подскажите пожалуйста как организовать, точнее для начала возможно ли это, если да, то как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2012, 12:42     Наследование и полиморфизм...
Посмотрите здесь:

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

А теперь еще раз вопрос: "Точно не получится организовать нечто подобное?".
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 13:06     Наследование и полиморфизм... #4
Предок не должен ничего знать о потомках.
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 13:08  [ТС]     Наследование и полиморфизм... #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ФУНКЦИЮ GET сделай виртуальной
она виртуальная...
на вопрос ответь.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.04.2012, 13:12     Наследование и полиморфизм... #6
Цитата Сообщение от Глупец Посмотреть сообщение
она виртуальная...
на вопрос ответь.
taras atavin ответил. Так не делают. Сделай просто отдельную функцию не член класса, выбора, что создавать. Конструктор не для того предназначен.
Да, пустого конструктора я не заметил
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2012, 13:14     Наследование и полиморфизм... #7
Так делать нельзя, всякое знание предка о потомках есть концептуальная ошибка. Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма.
alexey31415
 Аватар для 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){;}
сорри,не заметил,что это уже написали,вопрос закрыт
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 20:41  [ТС]     Наследование и полиморфизм... #9
Спасибо, Домовенок и Тарас.
Цитата Сообщение от taras atavin Посмотреть сообщение
Другое дело знание объекта формально базового класса о своём фактическом классе, вот это как раз норма и основа всякого полиморфизма
ты здесь имел в виду что то вроде флага?
т.е. есть несколько классов, у базового указана какая - то переменная, являющаяся константой для потомков (для перого - 1, второго - 2...).
или метода, который возвращает подобную константу.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.04.2012, 20:57     Наследование и полиморфизм... #10
Цитата Сообщение от Глупец Посмотреть сообщение
или метода, который возвращает подобную константу.
Методы возвращающие подобную константу аналогичны твоему методу virtual void get(void){puts("p1");}
То есть объект базового класса всё что теоретически может сказать - это только своё имя.
virtual int get_id(){return 1;/*признак класса base*/}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 21:13     Наследование и полиморфизм...
Еще ссылки по теме:

undefined reference (наследование и полиморфизм) C++
C++ Полиморфизм инкапсуляция и наследование(ООП)
Наследование, полиморфизм C++

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

Или воспользуйтесь поиском по форуму:
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
09.04.2012, 21:13  [ТС]     Наследование и полиморфизм... #11
понятно, спасибо.)
хотя препод вроде шарит...чего он хотел сказать написав это в методичке...((
Yandex
Объявления
09.04.2012, 21:13     Наследование и полиморфизм...
Ответ Создать тему
Опции темы

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