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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
#1

virtual функции - C++

07.02.2013, 18:20. Просмотров 2699. Ответов 32
Метки нет (Все метки)

я как-то пропустил лекцию по этой теме, и теперь совсем не понимаю назначение этих функций.
может кто поделиться ссылкой и нормальными примерами по этой теме?
и да, я умею пользоваться гуглом, и вводил "virtual функции с++", читал, и не понял ничего
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 18:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос virtual функции (C++):

Protected abstract virtual base pure virtual private destructor - C++
Хай, all) Вопрос не для начинающих и дурацкий) В разделе для экспертов публиковать не стал, чтобы не засорять его) Наткнулся тут на...

Возвращаемое значение virtual функции - C++
В инструкции указанно следующее virtual int getHost() создаю у себя в классе int getHost(){ return ?? }

Про перегрузку функции и Virtual в классах - C++
В общем вообще запутался с этим ООП... Вот есть в классе функция, перегрузка функции даёт возможность этой функции иметь несколько...

Зачем в конце объявления виртуальной функции ноль: virtual void show()=0 ? - C++
Здравствуйте. Что значат строки? И есть ли в них разница? virtual void show()=0; virtual void show(); Может ли быть такая запись? ...

Виртуальные функции (нужно ли во всех производных классах писать слово virtual?) - C++
Нужно ли во всех производных классах писать слово virtual? Или достаточно только один раз в базовом классе указать что функция...

Не работает virtual - C++
Вот написал пробный код, он не срабатывает: #include <iostream> using namespace std; class A{ public: virtual int c(); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13231 / 7503 / 846
Регистрация: 27.09.2012
Сообщений: 18,428
Записей в блоге: 3
Завершенные тесты: 1
07.02.2013, 18:29 #2
Почитайте еще про наследование и полиморфизм, будут конкретные примеры, как и для чего нужны виртуальные функции
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
07.02.2013, 18:39 #3
Если вы не используете наследование, приминение виртуальных функций безсмысленно.
http://ru.wikipedia.org/wiki/Виртуальный_метод

Вот нашёл в интернете (ПИСАЛ НЕ Я):

Наглядный пример.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
public:
   virtual void go() { cout << "A"; }
};
 
class B : public A {
public:
   void go() { cout << "B"; }
}
 
void main()
{
   A *x = new A();
   A *y = new B();
 
   x->go();
   y->go();
}
Если слово virtual стоит там где оно написано, но на экран будет выведено "AB".
Если убрать слово virtual, то на экран будет выведено "AA".

То есть несмотря на то, что у вас указатель на класс A, вызовется метод НАСЛЕДНИКА!!!
0
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 18:47 #4
Tiva, если функцию объявить виртуальной (virtual) и перегрузить её в классе(ах)-потомке(ах), то при её вызове, через указатель на базовый класс, будут вызываться вызываться именно та версия функции, которая определена в классе-потомке. Иначе была бы вызвана та версия, которая определена в базовом классе....

P.S. если Вам не известны некоторые слова, которые я использовал для объяснения, то курите маны
0
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
07.02.2013, 18:57  [ТС] #5
Цитата Сообщение от Пёс Посмотреть сообщение
Tiva, если функцию объявить виртуальной (virtual) и перегрузить её в классе(ах)-потомке(ах), то при её вызове, через указатель на базовый класс, будут вызываться вызываться именно та версия функции, которая определена в классе-потомке. Иначе была бы вызвана та версия, которая определена в базовом классе....

P.S. если Вам не известны некоторые слова, которые я использовал для объяснения, то курите маны
да слова-то мне все известны... я вот не понимаю...

есть класс А, в нем функция виртуальна. в классе В она переопределена.
и запись A->функция вызовет функцию из B? а если в классе С она тоже переопределена, как он определит какую вызвать?
0
Croessmah
Эксперт CЭксперт С++
13231 / 7503 / 846
Регистрация: 27.09.2012
Сообщений: 18,428
Записей в блоге: 3
Завершенные тесты: 1
07.02.2013, 19:10 #6
Компилятор создаст таблицу виртуальных функций и вызов этой функции будет происходить косвенно через vtbl
0
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 19:12 #7
Tiva, так, ещё раз....

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
#include <iostream>
using namespace std;
class A
{
public:
    virtual void F()
    {
        cout << "A::F()" << endl;
    }
};
class B : public A
{
public:
    void F()
    {
        cout << "B::F()" << endl;
    }
};
void main()
{
    A* pointerTypeA = new B(); /*Прошу обратить внимание на тип указателя и на тип объекта*/
    pointerTypeA->F();
    system("pause");
}
Попробуйте так. А потом сотрите "virtual" и сравните.
1
Croessmah
Эксперт CЭксперт С++
13231 / 7503 / 846
Регистрация: 27.09.2012
Сообщений: 18,428
Записей в блоге: 3
Завершенные тесты: 1
07.02.2013, 19:12 #8
Еще раз повторюсь - почитайте про полиморфизм
0
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 19:26 #9
А вот Вам пример с утечкой памяти. Скомпилируйте так. А потом сотрите "virtual", и поймёте где появилась утечка.

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
#include <iostream>
using namespace std;
class A
{
    char* p1;
public:
 
    A()
    {
        p1 = new char[10];
    }
    virtual ~A()
    {
        cout << "~A()" << endl;
        delete[] p1;
    }
};
class B : public A
{
    char* p2;
public:
    B()
    {
        p2 = new char[20];  
    }
 
    ~B()
    {
        cout << "~B()" << endl;
        delete[] p2;
    }
};
void main()
{
    A* pointerTypeA = new B(); /*Прошу обратить внимание на тип указателя и на тип объекта*/
    delete pointerTypeA;
    system("pause");
}
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.02.2013, 19:47 #10
Пёс, Во первых, никакой утечки памяти нет. Во вторых - не нужно писать такие вещи
Цитата Сообщение от Пёс Посмотреть сообщение
void main()
и уж тем более приводить их в пример новичкам.
0
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 19:56 #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Пёс, Во первых, никакой утечки памяти нет
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>
using namespace std;
class A
{
    char* p1;
public:
 
    A()
    {
        p1 = new char[10000];
    }
    ~A()
    {
        cout << "~A()" << endl;
        delete[] p1;
    }
};
class B : public A
{
    char* p2;
public:
    B()
    {
        p2 = new char[20000];  
    }
 
    ~B()
    {
        cout << "~B()" << endl;
        delete[] p2;
    }
};
void main()
{
    while(1)
    {
        A* pointerTypeA = new B[1000];    /*Прошу обратить внимание на тип указателя и на тип объекта*/
        delete[] pointerTypeA;
    }
    system("pause");
}
Правда чтоль? Скомпилируйте.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.02.2013, 19:58 #12
Вы свой предыдущий пример видели? Например строчку
C++
1
virtual ~A()
И я не буду компилировать код, который заведомо не рабочий.
0
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 20:00 #13
Цитата Сообщение от Toshkarik Посмотреть сообщение
Пёс, Во вторых - не нужно писать такие вещи
и уж тем более приводить их в пример новичкам.
Пишу как в книгах

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы свой предыдущий пример видели? Например строчку
C++
1
virtual ~A()
И я не буду компилировать код, который заведомо не рабочий.
1. Код рабочий.
2. Видел свой предыдущий пример. Советую Вам к тому примеру ещё приписку почитать сверху.
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
07.02.2013, 20:01 #14
Цитата Сообщение от Пёс Посмотреть сообщение
Пишу как в книгах
в каких????
Цитата Сообщение от Пёс Посмотреть сообщение
void main()
дозволяется в С
а в плюсах
C++
1
int main()
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.02.2013, 20:05 #15
Цитата Сообщение от Пёс Посмотреть сообщение
1. Код рабочий.
Нет, не рабочий, он не скомпилируется как минимум в GCC.

Цитата Сообщение от Пёс Посмотреть сообщение
2. Видел свой предыдущий пример. Советую Вам к тому примеру ещё приписку почитать сверху.
Когда читал, не увидел последнюю фразу, ее или не было тогда, или я просмотрел ее. Если не увидел я - то извиняюсь.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2013, 20:05
Привет! Вот еще темы с ответами:

Virtual и noreturn - C++
Возможно ли подружить virtual и noreturn? Пишу: struct test { int func(){error();} ]virtual void error(){throw 0;} }; ...

Virtual Protect - C++
Хочу установить защиту на весь регион памяти dll , но нечего не выходит , при просмотре через редактор памяти , атрибуты те же остаются ,...

тупняк с virtual :) - C++
Здравствуйте. пытаюсь прикрутить икслючения к своему &quot;модулю&quot;, и натыкаюсь на ругань компилятора: error: expected unqualified-id before...

Virtual метод - C++
Разбираю основы С++. Застрял на понятии virtual. Во всех источниках написано что это все сделано чтобы потомок родительского класса мог...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.02.2013, 20:05
Ответ Создать тему
Опции темы

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