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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
07.02.2013, 18:20     virtual функции #1
я как-то пропустил лекцию по этой теме, и теперь совсем не понимаю назначение этих функций.
может кто поделиться ссылкой и нормальными примерами по этой теме?
и да, я умею пользоваться гуглом, и вводил "virtual функции с++", читал, и не понял ничего
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
07.02.2013, 20:18  [ТС]     virtual функции #21
ммм, спасибо, кажется в моей голове начало что-то складываться ))

Добавлено через 1 минуту
а вот еще вопрос, последний
в родительском классе virtual void print()=0
это значит что это виртуальная функция, но она ничего не делает? т.е. её нельзя вызвать(или её вызов из родит класса ничего не сделает), а указывает, что в наследниках есть переопределенные функции. правильно? нечто прототипа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.02.2013, 20:22     virtual функции #22
Тут нужно понять сначала саму суть наследования. Само понятия, что B является так же и типом A. То есть с ним можно обращаться так же, как и с типом A. Виртуальная функция нужна, например, для специфического поведения объекта производного класса.

Добавлено через 2 минуты
Tiva, Это называется чисто виртуальная функция. Есть классы, которые просто описывают общий интерфейс для производных классов, которые уже сами будут определять поведение.

На фигурах конечно не рекомендуются изучать наследование. Но раз уж начали, то можно было создать класс, который бы просто назывался Фигура, и у него как раз была бы чисто виртуальная функция sho() или draw().
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.02.2013, 20:27     virtual функции #23
Цитата Сообщение от Tiva Посмотреть сообщение
в родительском классе virtual void print()=0
это значит что это виртуальная функция, но она ничего не делает? т.е. её нельзя вызвать(или её вызов из родит класса ничего не сделает), а указывает, что в наследниках есть переопределенные функции. правильно?
не совсем это называется чисто виртуальная функция
класс содержащий её называться абстрактный класс
он кстати может содержать несколько чистых виртуальных функций

объект создать от абстрактного класса нельзя

вот представь что в моем примере ты пытался бы создать объект фигура
но он ничего не знает ни о радиусе ни о количестве углов, в общем такая аморфная фигура

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

Добавлено через 1 минуту
C++
1
2
3
4
5
6
class CFigure
{
 public:
virtual void Draw()=0;
 
}
Пёс
 Аватар для Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 20:29     virtual функции #24
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
class A
{
    char p1;
 
public:
    A()
    {
        p1 = 'A';
    }
    virtual void print()
    {
        cout << p1 << endl;
    }
    
};
class B : public A
{
    char p2;
public:
    B()
    {
        p2 = 'B';
    }
    void print()
    {
        cout << p2 << endl;
    }
};
int main()
{
    A* pointersTypeA[10]; /*Прошу обратить внимание на тип указателя и на тип объекта*/
    for(int i=0; i<10; i++)
        if(i%2 != 0)
            pointersTypeA[i] = new A();
        else
            pointersTypeA[i] = new B();
    for(int i=0; i<10; i++)
        pointersTypeA[i]->print();
 
    system("pause");
    return 0;
}
Добавлено через 1 минуту
Пока писал, уже ответили )))
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.02.2013, 20:30     virtual функции #25
Цитата Сообщение от Toshkarik Посмотреть сообщение
На фигурах конечно не рекомендуются изучать наследование.
А че это не рекомендуется
как раз видна иерархия
Фигура
__ Многоугольник
_____Треугольник
_____Четырехугольник
________Квадрат
__Овал
____Элипс
_______Круг
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
07.02.2013, 20:32     virtual функции #26
Возможно, из этого примера Вам станет понятно как происходит вызов виртуальных функций(примерно):
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
#include <iostream>
 
class A{
protected:
    void (A::*virptr)();
    void foo(){
        std::cout<<"class A"<<std::endl;
    }
public:
    A(){
        this->virptr=&A::foo;
    }
    void virfunc(){
        (this->*virptr)();
    }
    int x;
};
 
class B:public A{
    void foo(){
        std::cout<<"class B"<<std::endl;
    }
public:
    B(){
        this->virptr=(void (A::*)())&B::foo;
    }
};
 
int main(){
    A * a=new A;
    A * b= new B;
    a->virfunc();
    b->virfunc();
}
Здесь кривая, но "ручная" виртуальная функция )))
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.02.2013, 21:25     virtual функции #27
Цитата Сообщение от ValeryS Посмотреть сообщение
__Овал
____Элипс
_______Круг
Хотя бы из за этого. С каких пор круг является овалом и элипсом? Или элипс овалом? Люди путаются в определениях.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.02.2013, 21:40     virtual функции #28
Цитата Сообщение от Toshkarik Посмотреть сообщение
С каких пор круг является овалом и элипсом? Или элипс овалом?
Вообще то меня учили что эллипс это частный случай овала а круг частный случай эллипса
или что то поменялось в геометрии ?
никто не мешает тебе создать свою иерархия
или ты считаешь, что абстракте объяснение класс А является наследником класса Б, более понятно?
ну тогда могу предложить еще одну иерархию

Млекопитающие
__Человек
____Женщина
____Мужчина
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.02.2013, 22:12     virtual функции #29
ValeryS, изучающий наследование должен понять смысл отношения является. Должна быть какая то логика.

Цитата Сообщение от ValeryS Посмотреть сообщение
что эллипс это частный случай овала а круг частный случай эллипса
А меня учили, что эллипс и овал разные фигуры. Как и круг. Частными случаями и овала и эллипса является окружность, никак не круг.

Наследование лучше изучать на реальных вещах и их абстракциях. Как например транспорт, автомобили и тд.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.02.2013, 22:19     virtual функции #30

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
является окружность, никак не круг.
согласен ступил
бытовое значение окружности привел(круг)
как обычно говорят "Нарисуй круг"


Цитата Сообщение от Toshkarik Посмотреть сообщение
А меня учили, что эллипс и овал разные фигуры.
Материал из Википедии — свободной энциклопедии
Овал (фр. ovale, от лат. ovum — яйцо) ― плоская замкнутая выпуклая C²-гладкая кривая (при этом под выпуклостью понимают свойство кривой иметь с любой прямой не более двух (действительных) общих точек).

Простейшим примером овала является эллипс (в частности, окружность).
Цитата Сообщение от Toshkarik Посмотреть сообщение
Наследование лучше изучать на реальных вещах и их абстракциях. Как например транспорт, автомобили
Ну и чем это лучше?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.02.2013, 22:27     virtual функции #31
ValeryS, Википедия, конечно, ресурс хороший. Но и ее пишут такие же люди. Я вообще слышал людей, которые утверждали, что овал является бытовым понятием эллипса.

Цитата Сообщение от ValeryS Посмотреть сообщение
Ну и чем это лучше?
Как по мне - лучше усваивается принцип. Легче установить отношение "является".
Ну а так даже на форуме можно поискать темы, в которых не рекомендовали изучать на фигурах, и критиковали за это преподавателей, которые это задавали.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,051
07.02.2013, 22:36     virtual функции #32
Цитата Сообщение от Toshkarik Посмотреть сообщение
которых не рекомендовали изучать на фигурах, и критиковали за это преподавателей, которые это задавали.
сам критиковал когда в качестве базового класса задавалась не абстрактная фигура а вполне конкретная точка
там действительно иерархия нарушалась, ну что может наследовать треугольник от точки?
а вообще можно и в автомобилях запутаться
вспомнилось

Не по теме:

Платон определил человека так: «Двуногое существо без перьев».
Тогда Диоген, собрав учеников, ощипал перед ними петуха: «Вот вам человек Платона!»


Не по теме:


Цитата Сообщение от Toshkarik Посмотреть сообщение
ValeryS, Википедия, конечно, ресурс хороший.
да мне просто быстрее в вике найти чем искать учебники геометрии
кстати учебники тоже люди пишут

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2013, 15:21     virtual функции
Еще ссылки по теме:

Возвращаемое значение virtual функции C++
Virtual и noreturn C++
Protected abstract virtual base pure virtual private destructor C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
11.02.2013, 15:21     virtual функции
  #33

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
На фигурах конечно не рекомендуются изучать наследование.
Тут вы зря. Я считаю пример с фигурами одним из лучших для демонстрации полиморфизма (а именно о нём речь). Во-первых, прослеживается чёткая иерархия, во-вторых, можно напридумывать фигурам кучу общих свойств (то же вычисление площади), и сразу становится видно, для чего нужен полиморфизм (каждая фигура знает, как вычислять свою площадь, и делает это по-своему).

Yandex
Объявления
11.02.2013, 15:21     virtual функции
Ответ Создать тему
Опции темы

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