|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] C++: Подскажите, в чем заключается ошибка. |
|
C/C++ - [решено] C++: Подскажите, в чем заключается ошибка.
|
Ветеран Сообщения: 1328 |
Профиль | Отправить PM | Цитировать
Решил изучить C++. Сейчас разбираюсь с наследованием классов и виртуальными функциями. Слабал простенькую программку:
//--------------------------------------------------------------------------- #pragma hdrstop #include <iostream.h> class Mammal { public: Mammal(){cout << "***\n\n";} virtual ~Mammal(){} virtual void Speak() const {cout << "Mammal speak!\n\n";} //protected: int z; }; class Dog : public Mammal { Dog(){} virtual ~Dog(){} void Speak() const {cout << "Dog speak!\n\n";} }; class Cat : public Mammal { Cat(){} virtual ~Cat(){} void Speak() const {cout << "Cat speak!\n\n";} }; //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { Mammal * theArray[3]; Mammal * ptr; int choice, i; for (i = 0; i < 3; i++) { cout << "(1)Dog (2)Cat: "; cin >> choice; switch (choice) { case 1: ptr = new Dog; break; case 2: ptr = new Cat; break; default: ptr = new Mammal; break; } if (ptr != NULL) { theArray[i] = ptr; } else { cout << "\n\nNULL ptr!!!\n\n"; } } cout << "\n\n"; for (i = 0; i < 3; i++) { theArray[i] -> Speak(); } int x; cin >> x; return 0; } //--------------------------------------------------------------------------- |
|
------- Отправлено: 02:27, 07-12-2009 |
Ветеран Сообщения: 1328
|
Профиль | Отправить PM | Цитировать Все, сам разобрался - забыл объявить методы классов Cat и Dog публичными, а по дефолту они являются приватными. Непонятно только почему тогда без проблем вызывался для объектов этих классов метод Speak()? Это связано с его виртуальностью?
|
------- Отправлено: 02:49, 07-12-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 5624
|
Профиль | Отправить PM | Цитировать Цитата Oleg_SK:
|
|
------- Отправлено: 03:03, 07-12-2009 | #3 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата Oleg_SK:
|
|
------- Отправлено: 03:16, 07-12-2009 | #4 |
Ветеран Сообщения: 1328
|
Профиль | Отправить PM | Цитировать Цитата Delirium:
Цитата El Scorpio:
|
|||
------- Отправлено: 07:17, 07-12-2009 | #5 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Oleg_SK, не содержащие какого-то специфичного кода методы "деструктор", "конструктор по умолчанию", "конструктор копирования" и "оператор присваивания" в C++ объявлять не обязательно - компилятор их создаёт и заполняет стандартным кодом автоматически.
Цитата Oleg_SK:
Порою вышеперечисленные методы специально объявляют, как private, если хотят запретить данное действие в классе и его потомках. Существование "закрытого" метода в родительском классе не позволяет компилятору генерировать стандартный код в производных объектах. Данное действие будет запрещено до явного объявления открытого метода. Явный пример - класс TObject из Borland C++ Builder. Объекты, производные от данного абстрактного класса, могут располагаться только в "куче", из-за чего операции создания объекта-копии и присваивания одного объекта другому применимы. По-этому для данного объекта явно указаны private методы TObject (const TObject &) и TObject& operator = (const TObject &). Далее, для объектов класса TComponent - невидимый компонент экранной формы - и производных от него всегда должно быть определено значение поля "владелец" (Owner). В*результате адрес компонента-владельца указывается, как параметр конструктора, а конструктор по умолчанию TComponent (void) также объявлен "закрытым" (или "защищённым", не помню точно) А вот результат создания "закрытого" деструктора я предсказать не могу |
|
------- Отправлено: 02:03, 08-12-2009 | #6 |
Ветеран Сообщения: 1328
|
Профиль | Отправить PM | Цитировать Кстати, забыл задать еще один вопрос по терминологии: является ли рекурсией ситуация, когда метод одного объекта класса вызывает себя в контексте другого объекта этого же класса?
|
------- Отправлено: 07:22, 09-12-2009 | #7 |
Ветеран Сообщения: 5624
|
Профиль | Отправить PM | Цитировать Самый простой способ ответить на вопрос - поставить точку отладки на начало функции и повызывать метод Если будет сам в себя заходить, то рекурсия.
Википедия - рекурсия |
------- Отправлено: 07:35, 09-12-2009 | #8 |
Ветеран Сообщения: 1328
|
Профиль | Отправить PM | Цитировать Вызывать то она себя вызывает. Если бы речь шла об обычной функции, то и вопроса бы не возникло, т.к. это очевидная рекурсия. У меня с этим объектно-ориентированным программированием уже похоже скоро крышу сорвет, т.к. начал сомневаться в обычных вещах. Если не углубляться в реализацию классов, то может создаться впечатление что у каждого объекта класса имеется своя копия набора методов этого класса. Например, есть связанный список, узлами которого являются объекты одного класса. У каждого объекта этого класса есть метод Insert, который, проверив вставляемый в список узел, решает либо самостоятельно вставить этот узел, либо отправляет его дальше по списку, передавая его методу Insert следующего узла списка (так производится сортировка при вставке). В списке есть множество узлов и соответственно множество идентичных по коду методов. Таким образом создается впечатление, что лично себя метод Insert не вызывает, а вызывает свою копию в следующем узле списка, которая в свою очередь может вызвать очередную свою копию в следующем узле списка и т.д. Рекурсия - это ситуация, когда функция вызывает саму себя. В описанном же мной случае, создается впечатление, что есть множество копий одной функции, которые последовательно вызывают друг-друга... Поэтому и возник вопрос: а рекурсия ли это вообще (если не углубляться в реализацию классов компилятором)?
|
------- Отправлено: 08:39, 09-12-2009 | #9 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата Oleg_SK:
Цитата Oleg_SK:
Как следствие, в рассматриваемой ситуации имеем N вложенных (рекурсивных) вызовов функции с разными значениями параметра this |
||
------- Отправлено: 02:37, 10-12-2009 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Ошибка ДНС 6702. В чем может быть дело? | tlekkanapin | Microsoft Windows NT/2000/2003 | 6 | 30-06-2010 16:11 | |
[решено] Подскажите чем оформить EXE-шник | Str_ani_ck | AutoIt | 16 | 05-08-2009 16:15 | |
[решено] Подскажите в чем проблемма. | misha5539 | Непонятные проблемы с Железом | 9 | 13-04-2008 14:51 | |
FreeBSD - [решено] Ошибка при установке xorg, подскажите куда копать? | masus | Общий по FreeBSD | 7 | 26-10-2007 15:48 | |
Проблема с HDD или Виндой? И в чем она заключается? | Virus1981 | Непонятные проблемы с Железом | 15 | 09-07-2006 14:01 |
|