Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2011, 23:19   #1
blacktener
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 78
По умолчанию полиморфизм и констркуторы

я тут долго писал и наверное немного непонятно но вот:

короче сегодня долго курил всю эту тему насчет виртуальных функций.
решил проверить свое понимание. сделал программку.
там смысл такой короче: есть класс монстер в котором есть два конструктора - по умолчанию и с аргментами. ну и две вирт. функции для проверочки.
есть два подкласса гоблин и паук. у них тоже есть по два конструктора и две фукнции.
в main() я создаю два указателя на обьект класса монстр и направляю кждый указатель на своего монстра. то есть я так понял что в тот момент когда я выделяю память в куче они как раз иницализируются. И если я при выделении памяти из кучи напишу аргументики то переменная strength из подкласса получит нужное значение. но вот как мне вызвать конструктор с аргументами для класс монстр.
В тот момент когда я инициализирую гоблина к примеру у меня сначала вызывается конутркор по умолчанию для монстра и потом конструктор с аргументами для гоблина. и непонятно как мне вызвать место кон-ра по умолчанию кон-р с арг-ми. там я еще реализовал нужную мне фигню по другому: я создал там обьект и скопировал его в обьект "гоблин". Но это далеко не всегда прокатит ведь если бы у меня переменная strength хранилась в базовом классе и передавалсь бы подклассу то она бы заменялась на какую нибудь случайную фигню(я проверял).
вот сама программа


Код:
#include <iostream>

using namespace std;

class monster
{
 public:
        int HP;
        monster() : HP(100)
        {
         cout << "creating monster" << endl;       
        };  
        monster (int hp)
        {
         HP = hp;
         cout << "creating monster with " << hp << " HP" << endl;       
        };    
        virtual void attack()
        {
         cout << "monster attacking " << endl;       
        };
        virtual void info()
        {
         cout << "monster: " << HP << " HP." << endl;       
        };
};

class spider : public monster
{
 public:
        int strength;
        spider() 
        {
         strength = 5;
         cout << "creating spider" << endl;       
        };             
        spider(int str)
        {
         strength = str;
         cout << "creating spider with " << str << " strength" << endl;          
        };
        void attack()
        {
         cout << "spider attacking" << endl;    
        };
        void info()
        {
         cout << "spider: " << HP << " HP, " << strength << " strength." << endl;       
        };
};

class goblin : public monster
{
 public:
        int strength;
        goblin()
        {
         strength = 8;
         cout << "creating goblin" << endl;        
        };     
        goblin(int str)
        {
         strength = str;
         cout << "creating goblin with " << str << " strength" << endl;          
        };
        void attack()
        {
         cout << "goblin attacking" << endl;    
        };
        void info()
        {
         cout << "goblin: " << HP << " HP, " << strength << " strength." << endl;       
        };
};

int main()
{
 monster a(69);
 monster* s;
 monster* g;
 s = new spider(5);
 g = new goblin(8);
 *s = a;
 s->attack();
 g->attack();
 s->info();
 g->info();
 delete s;
 delete g;
 system("PAUSE");
 return 0;   
};

Последний раз редактировалось ACE Valery; 06.03.2011 в 02:59.
blacktener вне форума Ответить с цитированием
Старый 06.03.2011, 00:35   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

чтобы вызывать конструктор базового класса с аргументами, передайте ему эти аргументы.. пример (не для вашей программы)
Goblin (int weight, int height, int strenght, char* w_type):Monster(weight,height,stren ght) { strcpy(weapon_type,w_type); }

оформите код тегами "код" , невозможно читать

Последний раз редактировалось onewho; 06.03.2011 в 00:52.
onewho вне форума Ответить с цитированием
Старый 06.03.2011, 04:32   #3
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Всё верно выше написали, используй список инициализации для выбора нужного конструктора.

Не по теме теперь. Почитай вторую половину поста http://programmersforum.ru/showpost....83&postcount=2 (со слов «Всё. Но осталось рассказать о важной вещи. Неотъемлемой частью документации к API и к коду является следование хорошим правилам именования.»). А также не делай публичные поля!
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 06.03.2011, 15:41   #4
blacktener
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 78
По умолчанию ?

а что такое поля?
и еще вопрос: как сделать чтобы подкласс наследовал
полностью весь базовый класс, включая защищенные члены?
blacktener вне форума Ответить с цитированием
Старый 06.03.2011, 15:47   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Obey-Kun имел ввиду это
Код:
public:
        int HP;
Поле HP сделать private. При наследовании в производном классе содержатся как бы копия базового класса. Точнее сказать подобъект базового класса.
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
полиморфизм slayerblya Общие вопросы C/C++ 1 27.02.2011 01:43
Полиморфизм в пхп Golovastik PHP 1 02.07.2010 20:40
Полиморфизм mister2010 Общие вопросы C/C++ 30 24.05.2010 01:07
Полиморфизм. Пример. Scratch Общие вопросы C/C++ 53 28.09.2008 18:46