Форум программистов, компьютерный форум, киберфорум
Наши страницы

Виртуальные функции в классах - нужен пример - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Strtok и strtok_s http://www.cyberforum.ru/cpp-beginners/thread1153419.html
Доброго времени суток. Есть вот такой код: Info::Info(ifstream &f) { char STR=""; char *delim = "\t"; char *ptr; f.getline(STR, 100, '\n'); if (strcmp(STR, " ") == 0) return; ptr=...
C++ Дана строка S и текстовый файл. Добавить строку S в начало и конец файла Дана строка S и текстовый файл. Добавить строку S в начало и конец файла. http://www.cyberforum.ru/cpp-beginners/thread1153418.html
C++ Написать программу на C++, для решения диф. уравнения
Помогите пожалуйста:(
C++ Найти количество элементов, значение которых больше среднего арифметического минимального и максимального элементов
Дан массив. Найти количество элементов, значение которых больше среднего арифметического минимального и максимального элементов.
C++ Разветвленный список - нужен пример реализации http://www.cyberforum.ru/cpp-beginners/thread1153393.html
Добрый день. Нужно сделать лабу по разветвленным спискам, но нигде не могу найти даже простейшего примера. Я только знаю, что разветвленный список - это список, в котором есть указатель на другой...
C++ Задано 4 матрицы. Провести сложение, умножение, умножение на число Задано 4 матрицы A,B,C,D размером 4х4.Вычеслить такие матрицы: F,G,T. G=3/4 A+B F=B*(2D) T=c/5 подробнее

Показать сообщение отдельно
Skedaddler
1 / 1 / 1
Регистрация: 24.02.2014
Сообщений: 13

Виртуальные функции в классах - нужен пример - C++

21.04.2014, 18:59. Просмотров 432. Ответов 3
Метки (Все метки)

Добрый день. Хочу сразу извиниться за столь простые вопросы (виртуальные функции считаются азами ООП). Однако я никак не могу вникнуть в виртаульные функции: и читал Страуструпа, и искал в интернете - понятнее не стало.
Был бы очень благодарен, если кто-нибудь напишет понятным языком что такое виртаульные функции и с чем их едят на моем примере.
Есть класс рациональных чисел:
Кликните здесь для просмотра всего текста

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
#ifndef RATIO_H
#define RATIO_H
#include <iostream>
using namespace std;
 
class Ratio
{   
    int num; // Числитель (numerator)
    int den; // Знаменатель (denominator)
public:
    Ratio() // Конструктор по умолчанию
    {num = 0; 
    den = 1;}
    explicit Ratio (int n, int d) : num(n), den(d) // Конструктор параметрами 
    {if (den == 0) 
    cout << "Error: знаменатель не можеть равняться нулю!\n";} 
    Ratio (const Ratio &src) : num(src.num), den(src.den) {} // Конструктор копирования
 
    /* Перегрузка операторов */
    Ratio operator* (const Ratio &x) const; // Оператор умножения дробей
    Ratio operator/ (const Ratio &x) const; // Оператор деления дробей
    Ratio& operator= (const Ratio &src); // Оператор присваивания
    Ratio& operator*= (const Ratio &x); // Оператор присваивания с умножением
    Ratio& operator/= (const Ratio &x); // Оператор присваивания с делением
    friend ostream& operator<< (ostream& outs, const Ratio &x); // Перегрузка ввода
    friend istream& operator>> (istream& ins, Ratio &x);  // Перегрузка вывода
    bool operator== (const Ratio &x) const; // Оператор эквивалентности
    bool operator!= (const Ratio &x) const; // Оператор не тождественности
    operator int() const; // Представление дроби как целого числа
    operator double() const; // Представление дроби как числа с плавающей запятой
    
    /* Методы */
    virtual void invert (); // Меняет местами числитель и знаменатель
    virtual void reduce (); // Сокращает дробь
    virtual int gcd (); // Находит наибольший общий делитель
    virtual ~Ratio() {}; // Деструктор  
};
 
#endif


Далее есть класс именованных дробей (то есть у каждое дроби будет какое-то имя). Этот класс является наследуемым у класса рациональных чисел.
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <stdlib.h>
#include <cstring> // Для работы с именем дроби
#include "Ratio.h" // Заголовочный файл с классом
 
class Named_Ratio: public Ratio // Класс именованных дробей
{
    string name; // Имя дроби
public:
    Named_Ratio (int n = 0, int d = 1, string na = "Default") : Ratio(n, d), name(na) {} // Конструктор по умолчанию с параметрами
    Named_Ratio (const Named_Ratio &src) : Ratio(src), name (src.name) {} // Конструктор копирования
 
    /* Перегрузка операторов */
    Named_Ratio operator* (const Named_Ratio &x) const; // Оператор умножения дробей
    Named_Ratio operator/ (const Named_Ratio &x) const; // Оператор деления дробей
    Named_Ratio& operator= (const Named_Ratio &src); // Оператор присваивания
    Named_Ratio& operator*= (const Named_Ratio &x); // Оператор присваивания с умножением
    Named_Ratio& operator/= (const Named_Ratio &x); // Оператор присваивания с делением
    friend ostream& operator<< (ostream& outs, const Named_Ratio &x); // Перегрузка ввода
    friend istream& operator>> (istream& ins, Named_Ratio &x);  // Перегрузка вывода
    bool operator== (const Named_Ratio &x) const; // Оператор эквивалентности
    bool operator!= (const Named_Ratio &x) const; // Оператор не тождественности
    operator int() const; // Представление дроби как целого числа
    operator double() const; // Предстаавление дроби как числа с плавающей запятой
 
    /* Методы */
    void invert (); // Меняет местами числитель и знаменатель
    void reduce (); // Сокращает дробь
    int gcd (); // Находит наибольший общий делитель
    ~Named_Ratio() {}; // Деструктор    
};


Вот моя логика (как я понял суть виртуальных функций): у меня есть методы в классе рациональных чисел (сокращение, поиск НОД, инвертирование). В классе именованных дробей они понадобятся мне только для чисел, а не для имени, поэтому я их оставляю без изменения, поэтому надо обращаться в базовый класс, соответственно они виртуальны. Так?
Деструктор виртаульный так как это является признаком хорошего тона и вроде как придется через указатель вызывать деструктор дочернего класса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru