Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
#1

Полиморфизм :( - C++

09.01.2010, 20:22. Просмотров 2009. Ответов 6
Метки нет (Все метки)

Всем здравствуйте. Ребят помогите пожалуйста с полиморфизмом. Я читал некоторые статьи и чем больше их читаю, тем больше возникает вопросов..

А вот сами вопросы, которые возникли при изучении полиморфизма:
1. Прочитал несколько статей на форуме, почитал маны различные и всё равно непонятно когда появляется полиморфизм.. Кто-то говорит, что когда происходит наследование и имя ф-ии в производном классе такое же как и в базовом, а кто-то что когда перед методом стоит virtual. Хотя вопрос мой может быть некорректен. Вроде бы virtual просто используется для позднего связывания. Но тем не менее вопрос остаётся в силе

2. Мне непонятна конструкция создания указателя.. Например Base *ptr = new Child; Я как-то привык к таким записям: int *ptr = new int; или double *ptr = new double[n]; но когда разные слова стоят, тогда неопределённость как у собаки Павлова, которой однажды не дали еду при загорании лампочки О чём говорит эта конструкция? И если так можно писать, то чем указатели различаются между собой, например чем отличается указатель на объект типа Base и объект типа Child? Разве у них не разные размеры? И вообще зачем так писать?

3. Есть классы А, АБ, АБЦ:
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
34
35
36
37
class A
{
public:
  virtual int Fun1(int key);
  virtual int Fun2(int key);
};
 
int A::Fun2(int key)
{
  cout << " Fun2( " << key << " ) from A " << endl;
  return 0;
}
 
class AB: public A
{
public:
  int Fun1(int key);
  int Fun2(int key);
};
 
int AB::Fun2(int key)
{
  cout << " Fun2( " << key << " ) from AB " << endl;
  return 0;
}
 
class ABC: public AB
{
public:
  int Fun1(int key);
};
 
int ABC::Fun1(int key)
{
  cout << " Fun1( " << key << " ) from ABC " << endl;
  return 0;
}
Что будет в таблице виртуальных ф-ий класса А, АБ, АБЦ? Какие вообще будут ф-ии в этих классах? Т.е. у нас же есть вирутальные и невиртуальные ф-ии и когда мы применяем наследование, то в производном классе будут такие же ф-ии что и в базовом, но это если случай с невиртуальными ф-ми, а вот если виртуальные, то создаётся таблица, в которую заносятся адреса этих ф-ий.. По какому правилу эти ф-ии заносятся в таблицу? Я ваще ничего не понимаю

4. Как работают виртуальные деструкторы? Точнее как работают обычные деструкторы при наследовании? Мы к примеру удаляем объект какого-то производного класса Child и при удаленни сначало вызовется деструктор ~Child(), а потом автоматически деструктор ~Base()? Если так, то понятно зачем нужны вирт деструкторы

5. Вопрос наверное не в тему, но что такое повышающее приведение типов? В гугле я нашёл что-то подобное:
Base base;
Child child;
base = child;
Но не понял в чём смысл... И где это можно использовать?

Вот основные вопросы которые у меня возникли Спасибо большое за внимание!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2010, 20:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Полиморфизм :( (C++):

С++ и полиморфизм - C++
Здравствуйте. Ответьте пожалуйста на несколько вопросов: 1. Что такое абстрактная функция простыми словами? 2. Что такое...

полиморфизм - C++
Всем привет, изучаю С++ недавно, я новичек в этом языке программирования, читаю про ООП, понял все за исключением полиморфизма, что делает...

полиморфизм=( - C++
Ув.Знатаки Доброго времени суток!Вот есть проблемка с написание полиморфизма,вот написал класс,написал наследование,а вот как теперь сюда...

Полиморфизм в с++ - C++
Вообщем я делал программу,изначально в ней было реализовано наследование.Затем дали задание реализовать полиморфзим для функции Scale для...

Полиморфизм - C++
Сколько я не читал книг и уроков по С++-программированию, я так и не смог понять что такое полиморфизм. Можно ли как-то просто и...

Полиморфизм - C++
Всем доброго времени суток, Разъясните пожалуйста задание: Создать класс живущих с местоположением . Определить наследуемые классы -...

6
Rififi
2360 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
09.01.2010, 20:43 #2
Vladd,

читай классиков - Кнута, Буча
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.01.2010, 20:50 #3
Согласен с Rififi. На статьях и манах далеко не уедешь.
Книги помогут в комплексном рассмотрении данного вопроса.
0
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
09.01.2010, 23:09  [ТС] #4
Спасибо конечно, но у меня щас нету времени на Буча (ещё 2 экзамена впереди).. Может всё-таки кто-нибудь ответит на некоторые вопросы?

Добавлено через 25 минут
Да, и если уж заговорили о Буче, то дайте пож-та ссылку на книжку Я нахожу только книги про проектирование и про UML...
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.01.2010, 01:49 #5
Цитата Сообщение от Vladd Посмотреть сообщение
Спасибо конечно, но у меня щас нету времени на Буча
Не надо его читать полностью, достаточно той части относящейся к полиморфизму.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.01.2010, 03:03 #6
слишком объемные вопросы чтобы так все рассказывать, возьмите любую книжку где описывается ооп в с++ в конце-концов
такие лекции в институтах читают, а не на форумах)
0
Aye Aye
369 / 283 / 36
Регистрация: 17.12.2009
Сообщений: 567
10.01.2010, 12:26 #7
надеюсь это тебе поможет:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
 
class base{
      protected:
              char name[80];
      private:
              int i;
      public:
             base(){cout << "constracting base with default constructor\n"; i=5;};
             base(const char *p){cout << "constracting base ";strcpy(name,p); cout << name << endl;}
             ~base(){cout << "destructing base " << name << endl;}
             //virtual - Г·ГІГ® ГЎГ» îáüÿâèòü, Г·ГІГ® f Г*Г*ñëåäóåòñÿ Гў ГЄГ*Г·ГҐГ±ГІГўГҐ ГЁГ*òåðôåéñГ*.
             virtual int f(int j){cout << "using int f(int) from base\n";return j*j;}
             int get(){return i;}
};
 
class secondary: public base{
      private:
             // char name[80];// Г*ГҐ Г*Г*äî ïîòîìó, Г·ГІГ® ГіГ*Г*ñëåäîâГ*Г*Г® ïîëå base::name;
             // ïîëå int i Г*ГҐ ГіГ*Г*ñëåäîâГ*Г*Г*Г®.
             int x;
      public:
             secondary(const char *p){cout << "constracting secondary ";strcpy(name,p); cout << name << endl;x=3;}
             ~secondary(){cout << "destructing secondary " << name << endl;}
             int f(int i){cout << "using int f(int) from secondary\n"; return i*i*i;} //âîò ГЄГ*ГЄ ГЎГ» ïîëèìîðôГ*Г*Гї ГґГіГ*êöèÿ.
             //ГҐГ±ГІГј int base::f(int) ГЁ ГҐГ±ГІГј int secondary::f(int) - îäГ*Г® èìÿ, Г°Г*Г§Г*ûå Г°Г*åëèçГ*öèè.
             int get(){return x;}
};
int main()
{
    {
          base *p=new secondary("ABC"); //áûë ñîçäГ*Г* îáüåêò ГЄГ«Г*Г±Г±Г* secondary, ГЁ ГҐГЈГ® Г·Г*Г±ГІГј ГЄГ«Г*Г±Г±Г* base òîæå áûëГ* ñîçäГ*Г*Г*.
           // p ññûëâГ*ГҐГІГ±Гї Г*Г* ГІГі Г·Г*Г±ГІГј îáüåêòГ*, êîòîðГ*Гї ÿâëÿåòñÿ base, ГЅГІГ® Г*Г*çûâГ*ГҐГІ "ñðåç ГЄГ«Г*Г±Г±Г*".
          //åñëè secondary s, ГІГ® s ГЄГ*ГЄ ГЎГ» ñîñòîèò ГЁГ§ äâóõ Г·Г*Г±ГІГҐГ© îäГ*Г*(secondary) âêëþ÷Г*ГҐГІ äðóãóþ(base);
          cout << "----\n";
          cout << p->f(5) << " " << p->get()<< endl;
          cout << "----\n";
          secondary *q;
          q=(secondary*)p; //p ГЁ q ГіГЄГ*çûâГ*ГѕГІ Г*Г* îäèГ* ГЁ òîò æå îáüåêò. Г§Г*ìåòèì, Г®Г* Г*ГҐ èñïîðòèëñÿ ïîñëå ñðåçГ*
          cout << q->f(5) << " " << q->get() << " "<<q->base::get() << endl;
          cout << "----\n";
          delete p;
          cout << "----\n";
          cout << "now q\n";
          delete q;
    }
    cout <<"-------------------------------------\n";
    {
          secondary s("DEF");
          cout << "----\n";
          base *p=0;
          cout << "----\n";
          p=&s;
          cout << "----\n";
          delete p;
    }
    cout <<"-------------------------------------\n";
    {
          secondary *p=new secondary("GS");
          cout << "----\n";
          cout << p->f(5) << endl;
          cout << "----\n";
          delete p;
    }
    getch();
    return 0;
}
запусти и внимательно почитай вывод на экран и коментарии

Добавлено через 20 минут
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
34
35
36
37
38
39
40
41
#include <iostream>
#include <conio.h>
using namespace std;
 
class MyInterface{ //ýòîò ГЄГ«Г*Г±Г± îáåñïå÷èâГ*ГҐГІ ГЁГ*òåðôåéñ (ГІГ*ГЄ Г±ГЄГ*Г§Г*ГІГј Г*Г*áîð èìåГ* ГґГіГ*êöèé) äëÿ ðåГ*ëèçГ*öèè.
      public:
            virtual int get()=0;
            virtual void set(int)=0;
};
 
class MyClass1:public MyInterface{
      private:
              int info;
      public:
             MyClass1(){}
             int get(){return info;}
             void set(int i){info=i*i;}
};
class MyClass2:public MyInterface{
      private:
              int info;
      public:
             MyClass2(){}
             int get(){return info;}
             void set(int i){info=i+i;}
};
int main()
{
    MyInterface * p=new MyClass1();
    p->set(4);
    cout << p->get() << endl;
    delete p; //ГіГ¤Г*ëèëè îáüåêò ГЄГ«Г*Г±Г±Г* MyClass1;
    //îäГ*ГЁ ГЁ òåæå èìåГ*Г*, Г*Г® Г°Г*Г§Г*Г*Гї ðåГ*ëèçГ*öèÿ, ГЅГІГ® ГЁ ГҐГ±ГІГј ïîëèìîðôèçì.
    p=new MyClass2();
    p->set(5);
    cout << p->get() << endl;
    delete p; //ГіГ¤Г*ëèëè îáüåêò ГЄГ«Г*Г±Г±Г* MyClass2;
    getch();
    //мы можем не значть точно какого класса обьект (MyClass1 или MyClass2) но пользоваться его методами, которые сами знают что им делать, т. к. у каждого класса они перегружены так что бы работать с его обьектами корректно.
    return 0;
}
0
10.01.2010, 12:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2010, 12:26
Привет! Вот еще темы с ответами:

Полиморфизм c++ - C++
Построить массив из указателей (базового типа) на объекты обоих классов. Выбрать объекты производного класса, отсортировать их и сложить...

Полиморфизм - C++
В одной дешевой книжке про него пишут а в другой дорогой нет и понять я почему то немогу точно как и для чего он нужен

Полиморфизм - C++
Я хотел реализовать множество, используя множественное наследование, но когда написал template &lt;class T&gt; class set { protected: ...

Полиморфизм - C++
Всем доброго времени суток.Сразу к делу. Если описывать с помощью полиморфизма подклассы и потом динамично их создавать ,то можно вызывать...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.