Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 13.03.2012
Сообщений: 419
1

Виртуальные методы

14.05.2015, 12:33. Показов 989. Ответов 7
Метки нет (Все метки)

народ вот пример с виртуальными методами, и вывод этой программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Ancestor
{
public:
  virtual void  function1 () { cout << "Ancestor::function1()" << endl; }
  void          function2 () { cout << "Ancestor::function2()" << endl; }
};
 
class Descendant : public Ancestor
{
public:
  virtual void  function1 () { cout << "Descendant::function1()" << endl; }
  void          function2 () { cout << "Descendant::function2()" << endl; }
};
 
Descendant*  pointer      = new Descendant ();
Ancestor*    pointer_copy = pointer;
 
pointer->function1 ();
pointer->function2 ();
 
pointer_copy->function1 ();
pointer_copy->function2 ();
Вывод:
Descendant::function1()
Descendant::function2()
Descendant::function1()
Ancestor::function2()

Все не могу понять как это работает, объясните пожалуйста, особенно не могу понять вот эти строки где создаются объекты
C++
1
2
Descendant*  pointer      = new Descendant ();
Ancestor*    pointer_copy = pointer;
по определению виртуальной функции это функция которая вызывается от реального типа объекта а не от точки зрения на него, не могу понять что значит точка зрения на него.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 12:33
Ответы с готовыми решениями:

Виртуальные методы
Здраствуйте , вот писал виртуальный метод доступа но почему то не получаеться , подскажите почему...

Виртуальные методы
Дан родительский класс Animal (поле кличка). И два наследованных от него класса-потомка: Cat (поле...

Виртуальные методы
...в голове не укладываются. Помогите кто может :confusion: У меня про них сложилось...

виртуальные методы
как вызвать виртуальный метод базового класса из наследуемого класса? struct A { virtual void...

7
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
14.05.2015, 13:16 2
Когда создаются объекты то
C++
1
Ancestor*    pointer_copy = pointer;
Просто создается указатель на объект другого класса. А виртуальные функции если и у "ребенка" и у "родителя" они одинаковые то вызывается функция ребенка
1
1453 / 790 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.05.2015, 13:17 3
Лучший ответ Сообщение было отмечено Семан как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Ancestor
{
public:
  virtual void  function1 () { cout << "Ancestor::function1()" << endl; }
  void          function2 () { cout << "Ancestor::function2()" << endl; }
};
 
class Descendant : public Ancestor
{
public:
  virtual void  function1 () { cout << "Descendant::function1()" << endl; }
  void          function2 () { cout << "Descendant::function2()" << endl; }
};
 
Descendant*  pointer      = new Descendant (); //статический тип Descendant*, динамический тип тоже Descendant*
Ancestor*    pointer_copy = pointer; // статический тип Ancestor*, динамический тип Descendant*
 
pointer->function1 (); // виртуальная функция - вызывается версия на основе динамического типа
pointer->function2 (); // не виртуальная функция - вызывается версия на основе статического типа
 
pointer_copy->function1 (); // виртуальная функция - вызывается версия на основе динамического типа
pointer_copy->function2 (); // не виртуальная функция - вызывается версия на основе статического типа
2
Pure Free Digital Ghost
4214 / 1674 / 323
Регистрация: 06.01.2013
Сообщений: 4,287
14.05.2015, 13:22 4
Семан, смотрите. Будь функция не виртуальная, компилер бы решил:
Так, вот у нас указатель на Ancestor. Раз мы вызываем метод, например
C++
1
pointer_copy->function2();
, то сразу в готовой программе будет вызов Ancestor::function2(); , так как указатель объявлен именно как Ancestor*

Если же функция виртуальная, компилятор ничего не решает. Это решает сама программа в рантайме, основываясь на таблице виртуальных методов самого объекта. А объект, на который указывает pointer_copy на деле не Ancestor, а Descendant
1
Эксперт PHP
2983 / 2503 / 1180
Регистрация: 14.05.2014
Сообщений: 7,071
Записей в блоге: 1
14.05.2015, 13:23 5
Цитата Сообщение от Семан Посмотреть сообщение
реального типа объекта а не от точки зрения на него
А она и вызывается от реального объекта, ведь память под него выделена, значит это полноценный объект. Дело здесь в другом: у нас есть два указателя разных типов(базовый и наследник), указывающих на один объект. Так вот, если вызывать невиртуальный метод через указатель на базовый класс, то вызовется метод базового класса.
1
Pure Free Digital Ghost
4214 / 1674 / 323
Регистрация: 06.01.2013
Сообщений: 4,287
14.05.2015, 13:24 6
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
реального объекта
Цитата Сообщение от Семан Посмотреть сообщение
реального типа объекта
Kerry_Jr, Вы немного упустили слово)
1
1 / 1 / 1
Регистрация: 13.03.2012
Сообщений: 419
14.05.2015, 14:05  [ТС] 7
Спасибо всем большой, я уже понял все, просто еще одно не могу понять, что значит "а не от точки зрения на него"
0
Pure Free Digital Ghost
4214 / 1674 / 323
Регистрация: 06.01.2013
Сообщений: 4,287
14.05.2015, 14:16 8
Семан, точка зрения в данном случае = тип указателя.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2015, 14:16

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Виртуальные методы
Всем доброго времени суток! Вопрос следующий. Как я могу функцией делать подмену виртуального...

виртуальные методы
#include&lt;iostream&gt; #include&lt;stdlib.h&gt; using namespace std; class MArray { protected:...

Виртуальные и переопределённые методы
Здравствуйте! Пусть есть очень простой базовый класс: class Base { public: virtual...

Наследование и виртуальные методы
Начал разбираться с темой наследование и не совсем понимаю как наследуются виртуальные методы,...


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

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

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