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

Вызов виртуальной функции через указатель на базовый класс - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Циклический сдвиг в матрице http://www.cyberforum.ru/cpp-beginners/thread1209591.html
Всем добрый день! Необходима помощь. Задание такое: Дана матрица int matr. Используя функции, сдвинуть циклически каждый нечетный столбец матрицы на количество элементов равное первому элементу в...
C++ Определить число соседних двух элементов с разными знаками Дан одномерный массив a из n элементов, элементы отличны от нуля. Определить число соседних двух элементов с разными знаками Написать код с комментариями http://www.cyberforum.ru/cpp-beginners/thread1209587.html
C++ Как сделать чтоб все проверки вызывались одной функцией?
Доброго времени суток! Имеется код с огромным числом вот таких проверок: cout << "\nEnter number (-100000 to 100000): "; while(!(cin>>x) || (x<(-100000)) || (x>100000) || cin.get() != '\n' )...
C++ Найти количество столбов матрицы, с нулевым элементом, и вывести номер строки с наибольшей серий одинаковых эл
дано прямокутную матрицу Знайти количество столбов в которьІх есть 0 елемент и вивести номер рядка в котором найдольшая серия одинаковьІх елементов
C++ Как Вычислить дробную часть среднего арифметического заданных положительных чисел. в clips http://www.cyberforum.ru/cpp-beginners/thread1209562.html
Как Вычислить дробную часть среднего арифметического заданных положительных чисел. в clips
C++ Ошибка в типе данных 'String' and 'System::String' Всем привет. помогите, выдает ошибку File1.cpp(40): E2015 Ambiguity between 'String' and 'System::String' //--------------------------------------------------------------------------- ... подробнее

Показать сообщение отдельно
Xaklex
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 4

Вызов виртуальной функции через указатель на базовый класс - C++

16.06.2014, 16:21. Просмотров 756. Ответов 8
Метки (Все метки)

Всем привет! Помогите пожалуйста разобраться с вызовом виртуальной функции в программе.

В моей программе требуется организовать класс треугольник, определенный по длинам трех сторон содержащий методы нахождения периметра и площади (по формуле Герона).

А так же определить виртуальную функцию для нахождения площади таким образом, чтобы в базовом и производном классе тела функций определялись по-разному.

Когда сдавал программу, преподаватель сказал, что не видит объявления виртуальной функции в программе. И сказал, что виртуальная функция вызывается только через указатель на базовый класс.

Программа состоит из 3-х файлов, помогите пожалуйста разобраться с объявлением виртуальной функции:

main:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "MyTriangle.cpp"
#include <iostream>
#include <windows.h>
using namespace std;
 
MyTriangle enter(){
    
    float x1, x2, x3; 
    cout << "Введите длину стороны A" << endl; 
    cin >> x1;
    cout << "Введите длину стороны B" << endl; 
    cin >> x2;  
    cout << "Введите длину стороны C" << endl; 
    cin >> x3;
    return MyTriangle(x1, x2, x3);
} 
 
void func() {
    MyTriangle tr;
    int number; 
    cout << "Введите данные треугольника " << endl;
    tr = enter();  
    cout << endl;
    cout << "1 Площадь по формуле Герона" << endl;
    cout << "2 Периметр " << endl;
    cout << "3 Высота " << endl;
    cout << "4 Площадь по высоте и основанию (Виртуальная функция)" << endl;
    cout << "5 Углы треугольника " << endl;
    cout << "6 Полное описание треугольника " << endl;
    cout << "Выберите что вы хотите сделать ваш вариант " << endl; 
    cin >> number; 
 
    switch(number) { 
        case 1: cout << "Площадь равна " << tr.newArea() << endl; break; 
        case 2: cout << "Периметр равен " << tr.perimetr() << endl; break; 
        case 3: cout << "Высота равна " << tr.height() << endl; break;
        case 4: cout << "Площадь по высоте и основанию равна " << tr.areaIsHeight() << endl; break; 
        case 5: tr.angle1(); break;
        case 6: cout << "Площадь равна (Виртуальная функция) " << tr.newArea() << endl;
         cout << "Периметр равен " << tr.perimetr() << endl;
         cout << "Высота равна " << tr.height() << endl;
         cout << "Площадь равна (формула Герона)  " << tr.areaIsHeight() << endl;
         tr.angle1(); break; 
        default: cout << "Не корректный ввод данных " << endl; break;
    }
}    
int main() {   
    setlocale(0, "rus"); 
    int k;
    cout << "1.Вводить данные" << endl;
    cout << "2.Выйти из программы" << endl;
    while(true){
        cout << "Введите номер операции" << endl; 
        cin >> k;
        switch(k) {
            case 1 : system("cls"); func(); break;
            case 2 : exit(EXIT_SUCCESS); break;
            default : cout << "Некорректный ввод данных" << endl;
        }
    }   
}
Triangle:
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
44
45
46
47
48
49
50
#include <iostream>
#include <cmath>
 
using namespace std;
 
class Triangle { 
    private: 
        float x1, x2, x3; 
        
    public: 
        Triangle() {}
        Triangle(float, float, float);
        ~Triangle() {}
        float perimetr(); 
        float height();
        float area2();
        void angle();
    const virtual float newArea() const {
        float p2 = (x1 + x2 + x3) / 2;
        float height = (2 * sqrt(p2 * (p2 - x1) * (p2 - x2) * (p2 - x3))) / x1;
        return 0.5 * x1 * height;
    }
}; 
 
Triangle::Triangle(float x1, float x2, float x3){
    this->x1 = x1;
    this->x2 = x2;
    this->x3 = x3; 
}
         
float Triangle :: area2() {
    float p2 = perimetr()/2;
    return sqrt(p2 * (p2 - x1) * (p2 - x2) * (p2 - x3));
} 
 
float Triangle :: perimetr() {
    return x1 + x2 + x3;  
} 
 
float Triangle :: height() { 
    float p2 = perimetr() / 2;
    return (2 * area2()) / x1;
}
 
void Triangle :: angle() {
    float A = (acos(cos((pow(x3, 2) + pow(x2, 2) - pow(x1, 2)) / (2 * x2 * x3))) * 180) / 3.14;
    float B = (acos(cos((pow(x1, 2) + pow(x3, 2) - pow(x2, 2)) / (2 * x1 * x3))) * 180) / 3.14;
    float C = 180 - (A + B);
    cout << "Угол А = " << A << " Угол В = " << B << " Угол С = " << C << endl;
}
MyTriangle:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "Triangle.cpp"
 
class MyTriangle : public Triangle {
    public:
        MyTriangle() : Triangle() {}
        MyTriangle(float x1, float x2, float x3) :
            Triangle(x1, x2, x3) {}
        float areaIsHeight();
        float height1();
        void angle1();
};
 
float MyTriangle :: areaIsHeight() {
    return area2();
}
 
float MyTriangle :: height1() {
    return height();
}
 
void MyTriangle :: angle1() {
    angle();
}
Программу писал мой однокурсник... Он тоже сдавал ее, преподаватель ее принял. А мне вот не повезло...
Очень надеюсь на Вашу помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru