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

Виртуальные функции - C++

Восстановить пароль Регистрация
 
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
14.04.2012, 21:06     Виртуальные функции #1
Пытаюсь понять что это такое
но не понимаю.
Может есть какие то болие понятные примеры , а то то что я смотрел не дало результата.
Рад любой информации.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2012, 21:06     Виртуальные функции
Посмотрите здесь:

C++ Виртуальные функции
виртуальные функции C++
C++ Виртуальные функции
C++ Виртуальные функции
виртуальные функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5945 / 5550 / 1783
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
14.04.2012, 21:24     Виртуальные функции #2
В базовом классе предполагается вызов функции,
которая будет разработана только в производном классе.
Компилятор создает специальную таблицу таких функций.
Вызов реализуется это так:
Создаем указатель на базовый класс,
но инициализируем его производным классом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class BASE
{
virtual void f();
};
class DERRIVED:public BASE
{
virtual void f();
};
int main()
{
     BASE* p;
     p=new DERRIVED;
     p->f();
}
В этом случае компилятор в момент выполнения p->f() подставляет
нужную функцию из вышеуказанной таблицы.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.04.2012, 21:26     Виртуальные функции #3
Цитата Сообщение от balrak Посмотреть сообщение
а то то что я смотрел не дало результата
а что вы смотрели? показывайте, разберем на вашем примере
Catstail
Модератор
 Аватар для Catstail
21486 / 10239 / 1668
Регистрация: 12.02.2012
Сообщений: 17,118
14.04.2012, 21:38     Виртуальные функции #4
Виртуальная функция, это функция, переопределяемая в классе-потомке. Вот пример:

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.h"
 
class B 
{
public:
virtual void fn (void)
    {
        cout << "in Base Class" << endl;
    }
 
};
 
class D : public B
{
 
public:
 
virtual void fn (void)
 {
    cout << "in Derive Class" << endl;
 }
 
};
 
void af(B& x)
{
    x.fn(); 
};
 
int main(int argc, char* argv[])
{
    B bb;
    D dd;  
 
    af(dd);
 
    return 0;
}
Здесь функция fn - виртуальная. И хотя x в функции af описан как ссылка на базовый класс, вызывается переопределенная в потомке функция.
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
14.04.2012, 22:10  [ТС]     Виртуальные функции #5
Цитата Сообщение от zss Посмотреть сообщение
В этом случае компилятор в момент выполнения p->f() подставляет
нужную функцию из вышеуказанной таблицы.
Как он понимает что она нужная? как я понимаю p указывает на DERRIVED и при выполнении p->f() компилятор просто найдет эту функцию в классе DERRIVED . Зачем тогда виртуальная функция в базовом классе?

Добавлено через 2 минуты
Jupiter, мои примеры аналогичны этим 2 примерам.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
14.04.2012, 22:17     Виртуальные функции #6
Цитата Сообщение от balrak Посмотреть сообщение
Как он понимает что она нужная? как я понимаю p указывает на DERRIVED и при выполнении p->f() компилятор просто найдет эту функцию в классе DERRIVED . Зачем тогда виртуальная функция в базовом классе?

Добавлено через 2 минуты
Jupiter, мои примеры аналогичны этим 2 примерам.
вы хоть мануал чтоли или книжку почитайте. С объектами принято работать через указатель на базовый класс!и при вызове метода через указатель на базовый класс, вызовется функция класса потомка только тогда, когда она объявлена как виртуальная!
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
class Shape
{
    virtual double getArea() const = 0;
};
 
class Circle: public Shape
{
    virtual double getArea() const
    {
        //do something
    }
};
 
class Rectangle: public Shape
{
    virtual double getArea() const
    {
        //do something
    }
};
 
 
 
int main() 
{ 
    Shape *f1 = new Circle ();
    Shape *f2 = new Rectangle ();
 
    f1->getArea(); // вызовется circle::getarea()
    f2->getArea(); // вызовется rectangle::getarea()
    return (0); 
}
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
14.04.2012, 23:07  [ТС]     Виртуальные функции #7
Цитата Сообщение от panicwassano Посмотреть сообщение
вы хоть мануал чтоли или книжку почитайте
я какраз книгу и читаю.

Добавлено через 1 минуту
Цитата Сообщение от panicwassano Посмотреть сообщение
Shape *f1 = new Circle ();
разве f1 не будет указывать класс circle?
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
14.04.2012, 23:08     Виртуальные функции #8
Цитата Сообщение от balrak Посмотреть сообщение
я какраз книгу и читаю.

Добавлено через 1 минуту

разве f1 не будет указывать класс circle?
вы не поняли, указатель имеет тип Shape, он хранит адрес Circle. Чтобы компилятор понял какую из 2х функций вызвать во время выполнения, ему нужно это явно указать через virtual. Иначе он будет вызывать метод базового класса!
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
14.04.2012, 23:15  [ТС]     Виртуальные функции #9
panicwassano,
я должен указать 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
39
40
41
42
43
#include <iostream>
 
class employee
{
    char* name;
    short id;
public:
    employee(char* = "Dawa" , short = 0);
    char* getname(){return name;};
    virtual void print()
    {
        std::cout << "its employee " << name << "_" << id <<std::endl;
    }
};
 
class meneger : employee
{
public:
    meneger(char* ="" , short = 0);
    void print()
    {
        std::cout << getname() << " is  meneger "  << '\n' ;
    }
};
 
employee::employee(char* n, short s)
    :name(n), id(s)
{
}
 
meneger::meneger(char* ne, short se)
    :employee(ne, se)
{
 
}
 
void main()
{
    employee* m = new meneger ("Dawa", 5);
    m->print();
    /*employee e;
    e.print();*/
}
вот что выдает :

1>c:\users\oleynik\documents\visual studio 2010\projects\lessson _\lessson _\lesson _.cpp(39): error C2243: 'type cast' : conversion from 'meneger *' to 'employee *' exists, but is inaccessible
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
14.04.2012, 23:32     Виртуальные функции #10
в строке 16 неуказан тип наследования, по умолчанию наверно private
вы хотя бы переводите что вам компилятор пишет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 00:12     Виртуальные функции
Еще ссылки по теме:

виртуальные функции C++
Виртуальные функции C++
C++ Виртуальные функции

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

Или воспользуйтесь поиском по форуму:
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
15.04.2012, 00:12  [ТС]     Виртуальные функции #11
panicwassano, да я перевел но тогда не понял
огромное спасибо за помошь
Yandex
Объявления
15.04.2012, 00:12     Виртуальные функции
Ответ Создать тему
Опции темы

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