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

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

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

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

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

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

виртуальные и чисто виртуальные функции - C++
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include <iostream> using...

Виртуальные функции - C++
Не работает код. Проблема в виртуальной функции. Как это можно исправить? #include <iostream> class Convert { protected: ...

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

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

Виртуальные функции - C++
Создайте класс Word, определите в нем виртуальную функцию-член word_main(*char x), которая выводит на экран фразу: “Я знаю слово x”....

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,222
Завершенные тесты: 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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.04.2012, 21:26 #3
Цитата Сообщение от balrak Посмотреть сообщение
а то то что я смотрел не дало результата
а что вы смотрели? показывайте, разберем на вашем примере
Catstail
Модератор
22541 / 10946 / 1775
Регистрация: 12.02.2012
Сообщений: 18,083
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
вы хотя бы переводите что вам компилятор пишет
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
15.04.2012, 00:12  [ТС] #11
panicwassano, да я перевел но тогда не понял
огромное спасибо за помошь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2012, 00:12
Привет! Вот еще темы с ответами:

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

Виртуальные функции - C++
Здрасте! вот задачка, какбэ сделал, но нужны виртуальные функции. даже не знаю как их сделать. #include &lt;iostream.h&gt; #include...

виртуальные функции - C++
Помогите пожалуйста, создать абстрактный класс Shape с двумя чисто виртуальными методами Area() и Print(). Определить производные классы ...

Виртуальные функции - C++
Вопрос. Как вызвать функцию наследника через указатель на базовый класс? Так не компилируется 3.cpp:19:19: error: invalid covariant...


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

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

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