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

Для чего виртуальные функции? - C++

Восстановить пароль Регистрация
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
07.11.2013, 22:06     Для чего виртуальные функции? #1
Как я понял в классах наследниках их можно использовать,для одинаковых имен функций. Но помойму это не главное их свойство.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2013, 22:06     Для чего виртуальные функции?
Посмотрите здесь:

Для чего нужны callback-функции C++
Прототип функции.Для чего нужен C++
C++ виртуальные и чисто виртуальные функции
C++ Виртуальные функции
C++ Для чего нужны указатели на функции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
07.11.2013, 22:16     Для чего виртуальные функции? #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
33
34
#include <iostream>
 
 
struct Parent {
    virtual void foo ( ) {
        std :: cout << "Parent::foo ( )" << std :: endl ;
    }
    void bar ( ) {
        std :: cout << "Parent::bar ( )" << std :: endl ;
    }
} ;
 
struct Child : Parent {
    virtual void foo ( ) {
        std :: cout << "Child::foo ( )" << std :: endl ;
    }
    void bar ( ) {
        std :: cout << "Child::bar ( )" << std :: endl ;
    }
} ;
 
void test ( Parent & obj ) {
    obj.foo ( ) ;
    obj.bar ( ) ;
}
 
int main ( ) {
    Parent obj1 ;
    Child obj2 ;
    std :: cout << "Test Parent:" << std :: endl ;
    test ( obj1 ) ;
    std :: cout << "Test Child:" << std :: endl ;
    test ( obj2 ) ;
}
Alex0491
0 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 15
07.11.2013, 22:55     Для чего виртуальные функции? #3
Для того чтобы функцию можно переопределить в наследнике
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.11.2013, 23:08     Для чего виртуальные функции? #4
Цитата Сообщение от Alex0491 Посмотреть сообщение
Для того чтобы функцию можно переопределить в наследнике
её и без виртуальности можно переопределить в наследнике
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
08.11.2013, 09:42     Для чего виртуальные функции? #5
Виртуальные функции - это инструмент, с помощью которого реализуется полиморфизм, т.е. множество реализаций (в потомках базового класса) и один интерфейс (одно имя метода для всех потомков). Базовый класс, в котором есть только определение виртуального метода без реализации называется абстрактным классом.
C++
class Animal {
public:
  virtual void setfood() { cout << "Ошибка. Неизвестный зверь\n"; }
};
 
class Dog : public Animal {
public:
  virtual void setfood() { cout << "дать педигри\n"; }
};
 
class Cat : public Animal {
public:
  virtual void setfood() { cout << "дать вискас\n"; }
};
 
 
int main()
{
  Animal *animal;
  Dog dog;
  Cat cat;
 
  animal->setfood();
 
  animal = &dog;
  animal->setfood(); // или dog.setfood();
 
  animal = &cat;
  animal->setfood(); // или cat.setfood();
 
}
Добавлено через 3 минуты
Цитата Сообщение от Alex0491 Посмотреть сообщение
Для того чтобы функцию можно переопределить в наследнике
Переопределить можно, но без виртуальности переопределение затронет не конкретного потомка, а всех подряд.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
08.11.2013, 09:48     Для чего виртуальные функции? #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
  Animal *animal; //  animal имеет тип "указатель на базовый класс"
  Animal UnKnown;
  Dog dog;
  Cat cat;
  
  animal = &UnKnown;  // инициализируем указатель адресом базового класса.
  animal->setfood();  // вызывается метод из базового класса Animal
 
  animal = &dog;   // инициализируем указатель адресом производного класса.
  animal->setfood(); // вызывается метод из производного класса Dog
 
  animal = &cat;  // инициализируем указатель адресом другого производного класса.
  animal->setfood(); //  // вызывается метод из производного класса Cat
}
Yandex
Объявления
08.11.2013, 09:48     Для чего виртуальные функции?
Ответ Создать тему
Опции темы

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