Консультация № 57297
01.10.2006, 09:08
0.00 руб.
0 6 4
Здравствуйте!

Вопрос по С++;

Имеется 2 класса

class parent
{
};

class child: public parent
{
int pole1;
public:
int method1()
{
return pole;
}
};

void main()
{
parent *p;
p=new child;
}
Вопрос в том, как через указатель p получить доступ к методам класса child, если это возможно ?

Заранее благодарен за ответ! :)

Обсуждение

Неизвестный
01.10.2006, 10:20
общий
это ответ
Здравствуйте, Svanshe!
А почему бы не попробовать так...

void main()
{
parent *p=new child;;
int i = p->method1();
}
Неизвестный
01.10.2006, 10:56
общий
Здравствуйте, UmanНу хотя бы потому что компилятор на такое пишет method1 is not a member of parent :)
Неизвестный
01.10.2006, 12:21
общий
это ответ
Здравствуйте, Svanshe!
Тут нужно явно преобразовать преобразование типов, которое можно выполнить двумя способами:

((child *)p)->method();

или

union
{
parent *pParent;
child *pChild
} p1

p1.pParent = p;
p1.pChild->method();
давно
Академик
20764
1861
01.10.2006, 19:20
общий
это ответ
Здравствуйте, Svanshe!

через dynamic_cast. Другие способы могут привести к неприятностям. Смотрите в приложении.

Вообще-то чтобы делать так, нужны очень веские основания. Попытайтесь обойтись виртуальными методами, перегружеными (overloaded) в классе child

Приложение:
child *pc = dynamic_cast<child *>(p);if (!pc) { // не получилось - реальный объект был не child} else { pc->method1();}
Неизвестный
02.10.2006, 10:05
общий
это ответ
Здравствуйте, Svanshe!
А компилятор не ругается на строку
p = new child;
?
Я бы написал
p = (parent*) new child;

А доступ получить элементарно - преобразованием типа:
((child*)p)->method1();

И раз Вы создаете объект child, не забудьте что удалять нужно тоже его, т.е.
delete (child*)p;
Неизвестный
05.10.2006, 16:17
общий
Всем огромное спасибо за проявленное внимание к моему впросу.И вс-таки....dynamic_cast<child *>(p);лучше, чем, только лишь тем, что задает значениее NULL, если указатель указывает неверно и пораждает исключение badcast?
Форма ответа