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

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

Войти
Регистрация
Восстановить пароль
 
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
#1

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

14.04.2012, 21:06. Просмотров 964. Ответов 10
Метки нет (Все метки)

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

Виртуальные функции. - C++
Приветствую всех. Дана такая программа (на самом деле она больше и сложнее, но структура и проблема те же): #include <iostream> ...

Виртуальные функции - C++
Пожалуйста, подскажите как быть: class Circles; class Rectangs; class Snake { public: Circles *drr; void start1(); ...

Виртуальные функции - C++
Помогите пожалуйста написать задачу, никак не могу разобраться. Создайте класс Matr, определите в нем виртуальную функцию-член...

Виртуальные функции - C++
Создать абстрактный базовый класс с виртуальной функцией - объем. Создать производные классы: параллелепипед, пирамида, тетраэдр, шар со...

Виртуальные функции - C++
Составить программу в С Buildere. Объявить базовый класс с именем person {имя, возраст, группа}. Определить функцию show (), которая...

виртуальные функции - C++
ввести виртуальную функцию class A { void init(); } classB:A { void init(); }

виртуальные функции - C++
Здравствуйте.Перечитал различные статьи,но не могу до конца вникнуть в смысл использования виртуальных функций.Для взаимного понимания...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6280 / 5883 / 1904
Регистрация: 18.12.2011
Сообщений: 15,085
Завершенные тесты: 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
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.04.2012, 21:26     Виртуальные функции #3
Цитата Сообщение от balrak Посмотреть сообщение
а то то что я смотрел не дало результата
а что вы смотрели? показывайте, разберем на вашем примере
Catstail
Модератор
22442 / 10847 / 1765
Регистрация: 12.02.2012
Сообщений: 17,962
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
591 / 559 / 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
591 / 559 / 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
591 / 559 / 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++
интересует 2 вопроса:1)Какими элементами могут отличаться экземпляры одной виртуальной функции, находящиеся в разных производных...

Виртуальные функции - C++
Если в базовом классе А есть виртуальная функция show() перегруженная, то есть имеется три разные версии этой функции. Есть класс Б...

Виртуальные функции С++ - C++
Задача: В классе хранится целое, и определяется виртуальная функция shownum(). Создать 2 производных класса, наследующие класс num. В...

Виртуальные функции - C++
Подскажите пожалуйста, как передать переменную из одной виртуальной функции в другую. Вот код программы работает правильно, но в остальных...

Виртуальные функции - C++
Доброго времени суток. Есть задание. Создать абстрактный класс Function (функция) с виртуальными методами вычисления значения функции...


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

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

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