Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
Vladd
0 / 0 / 0
Регистрация: 25.10.2009
Сообщений: 11
09.01.2010, 20:22     Полиморфизм :( #1
Всем здравствуйте. Ребят помогите пожалуйста с полиморфизмом. Я читал некоторые статьи и чем больше их читаю, тем больше возникает вопросов..

А вот сами вопросы, которые возникли при изучении полиморфизма:
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;
Но не понял в чём смысл... И где это можно использовать?

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

Полиморфизм C++
C++ полиморфизм
C++ Полиморфизм
Полиморфизм. C++
Полиморфизм c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
09.01.2010, 20:43     Полиморфизм :( #2
Vladd,

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

Добавлено через 25 минут
Да, и если уж заговорили о Буче, то дайте пож-та ссылку на книжку Я нахожу только книги про проектирование и про UML...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
10.01.2010, 01:49     Полиморфизм :( #5
Цитата Сообщение от Vladd Посмотреть сообщение
Спасибо конечно, но у меня щас нету времени на Буча
Не надо его читать полностью, достаточно той части относящейся к полиморфизму.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
10.01.2010, 03:03     Полиморфизм :( #6
слишком объемные вопросы чтобы так все рассказывать, возьмите любую книжку где описывается ооп в с++ в конце-концов
такие лекции в институтах читают, а не на форумах)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2010, 12:26     Полиморфизм :(
Еще ссылки по теме:

Полиморфизм C++
C++ Полиморфизм
Полиморфизм C++

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

Или воспользуйтесь поиском по форуму:
Aye Aye
 Аватар для Aye Aye
367 / 281 / 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;
}
Yandex
Объявления
10.01.2010, 12:26     Полиморфизм :(
Ответ Создать тему
Опции темы

Текущее время: 15:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru