|
|
|
проблемы с указателем на базовый класс
|
|||
|---|---|---|---|
|
#18+
Скажите, пожалуйста, почему не работает следующий код. Почему не доступен метод func2()? class CObject { public: virtual void func1() = 0; }; class MyObject: public CObject { public: virtual void func1() { } void func2() { } }; int _tmain(int argc, _TCHAR* argv[]) { CObject* object; object = new MyObject(); object->func1(); object->func2(); return 0; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2006, 15:22 |
|
||
|
проблемы с указателем на базовый класс
|
|||
|---|---|---|---|
|
#18+
Да потому что у CObject нет функции func2() По идее надо было писать что-то типа CMyObject* object; object = new MyObject(); object->func1(); object->func2(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2006, 15:45 |
|
||
|
проблемы с указателем на базовый класс
|
|||
|---|---|---|---|
|
#18+
С помощью указателя на базовый класс разве я не могу вызывать методы дочернего класса? После строчки object = new MyObject(); по идее можно вызывать методы дочернего класса. Может быть я очень сильно торможу, но по-моему всё должно работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2006, 15:53 |
|
||
|
проблемы с указателем на базовый класс
|
|||
|---|---|---|---|
|
#18+
OLEG_2005С помощью указателя на базовый класс разве я не могу вызывать методы дочернего класса? После строчки object = new MyObject(); по идее можно вызывать методы дочернего класса. Может быть я очень сильно торможу, но по-моему всё должно работать. Для этого как раз и надо в базовом объявить виртуальную func2(), он ведь "знает" о своих потомках не более, чем о себе. Почитай ещё разок про полиморфизм, наследование, виртуальные базовые классы... Пару примеров: http://www.geocities.com/mikerisan/Module17.html http://www.cplusplus.com/doc/language/tutorial/polymorphism.html Кроме того можно использовать *_cast для приведения указателя к нужному типу. Например: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2006, 15:59 |
|
||
|
проблемы с указателем на базовый класс
|
|||
|---|---|---|---|
|
#18+
Подумайте о следующем: взаимосвязь классов и создание объекта напоминает схему, где родительский класс является интерфейсным. Если вы действительно хотели это написать, то создайте в интерфейсе виртуальный метод, который переопределяется в реализации, то бишь в потомке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2006, 16:26 |
|
||
|
проблемы с указателем на базовый класс
|
|||
|---|---|---|---|
|
#18+
OLEG_2005С помощью указателя на базовый класс разве я не могу вызывать методы дочернего класса? После строчки object = new MyObject(); по идее можно вызывать методы дочернего класса. Может быть я очень сильно торможу, но по-моему всё должно работать. В данном случае к MyObject обращаешься косвенно. Суть Object *object = new MyObject(); в том чтобы отделить объект Object от его реализации в MyObject. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2006, 16:29 |
|
||
|
проблемы с указателем на базовый класс
|
|||
|---|---|---|---|
|
#18+
OLEG_2005...... class MyObject: public CObject { public: virtual void func1() { } void func2() { } }; ..... свои пять копеек... приведённый код не рабочий... если вставляете тело методов в обьявление, то НЕ забывайте точку запятую после каждой закрывающей фигурной скобки... удачи Вам (круглый) ЗЫ По вопросу. Предлагаю заглянуть в книгу Джэфри Элджера "C++" - очень интересные технические решения. Ну и заодно убьёте много вопросов "почему". Хотя, я бы не назвал это "фундаментальным учением"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2006, 17:17 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33908491&tid=2030703]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 370ms |

| 0 / 0 |
