23 / 10 / 1
Регистрация: 08.10.2015
Сообщений: 386
1

Вызвать конструктор производного класса без конструктора базового класса

16.11.2017, 18:45. Показов 982. Ответов 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
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <iostream>
#include <cmath>
#include <cstdlib>
#define PI 3.14159265
using namespace std;
class Triangle
{
private:
        struct point{
                double x, y;
        }a, b, c;
        double length(point &a, point &b)
        {
                return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
        }
 protected:
        double lenab, lenac, lenbc;
 
        double ugol(double lenb, double lenc, double lena)
        {
 
                return acos((lenb*lenb + lenc*lenc - lena*lena) / (2.0*lenb*lenc))*180/PI;
        }
        double perimetr()
        {
                return lenab + lenac + lenbc;
        }
        double square()
        {
                double p = perimetr() / 2.0;
                return sqrt(p*(p - lenab)*(p - lenac)*(p - lenbc));
        }
        double ravnTr(Triangle &x)
        {
                return (lenab == x.lenab) && (lenac == x.lenac) && (lenbc == x.lenbc);
        }
public:
        int proverka()
        {
                return (lenab + lenac >= lenbc) && (lenab + lenbc >= lenac) && (lenac + lenbc >= lenab);
        }
        static void ravntriangle(Triangle *arr,int n)
        {
                for (int i  = 0,j=0; i < n-1;++i)
                        for (j = i+1; j < n - 1;++j)
                                if (arr[i].ravnTr(arr[j]))
                                        cout << "Triangle " << i << " = Triangle " << j << endl;
        }
        void setpoint(point &x)
        {
                cout << "Input x" << endl;
                cin >> x.x;
                cout << "Input y" << endl;
                cin >> x.y;
        }
        Triangle()
        {
                cout << "Point a" << endl;
                setpoint(a);
                cout << "Point b" << endl;
                setpoint(b);
                cout << "Point c" << endl;
                setpoint(c);
                lenab = length(a, b);
                lenac = length(a, c);
                lenbc = length(b, c);
        }
        virtual void show()
        {
                if (proverka())
                {
                        cout << "Point a" << endl;
                        cout << "x= " << a.x << " y= " << a.y << endl;
                        cout << "Point b" << endl;
                        cout << "x= " << b.x << " y= " << b.y << endl;
                        cout << "Point c" << endl;
                        cout << "x= " << c.x << " y= " << c.y << endl;
                        cout << "ab= " << lenab << " ac= " << lenac << " bc= " << lenbc << endl;
                        cout << "ugol c = " << ugol(lenac, lenbc, lenab) << " ugol b = " << ugol(lenbc, lenab, lenac) << " ugol a = " << ugol(lenac, lenab, lenbc) << endl;
                        cout << "perimetr= " << perimetr() << endl;
                        cout << "square= " << square() << endl;
                }
                else
                        cout << " Triangle is not " << endl;
        }
 
};
 
 
class RavnTriangle:public Triangle
{
public:
        int proverkaravn()
        {
                return lenab + lenac + lenbc;
        }
        double mediana()
        {
                return lenab*sqrt(3.0) / 2.0;
        }
        static double lowmediana(RavnTriangle *arr, int n)
        {
                int min=0;
 
                for (int i = 1; i < n - 1;++i)
                if (arr[i].mediana() < arr[min].mediana())
                        min = i;
 
                return arr[min].mediana();
        }
        void show()
        {
                if (proverkaravn())
                {
                        cout << "ab= " << lenab << " ac= " << lenac << " bc= " << lenbc << endl;
                        cout << "ugol c = " << ugol(lenac, lenbc, lenab) << " ugol b = " << ugol(lenbc, lenab, lenac) << " ugol a = " << ugol(lenac, lenab, lenbc) << endl;
                        cout << "mediana = " << mediana() << endl;
                        cout << "perimetr= " << perimetr() << endl;
                        cout << "square= " << square() << endl;
                }
                else
                        cout << " Triangle is not " << endl;
        }
        RavnTriangle()
        {
                cout << "input ab" << endl;
                cin >> lenab;
                cout << "Point ac" << endl;
                cin >> lenac;
                cout << "Point bc" << endl;
                cin >> lenbc;
        }
 
};
int main()
{
        int i = 0,n,m;
        cout << "input n" << endl;
        cin >> n;
        cout << "input m" << endl;
        cin >> m;
        Triangle* a = new Triangle [n];
        for (; i < n;++i)
        {
                cout << "triangle " << i << endl;
                a[i].show();
 
        }
 
        Triangle::ravntriangle(a, n);
        RavnTriangle* b = new RavnTriangle[m];
        for (i=0; i < m; ++i)
        {
                cout << "ravntriangle " << i << endl;
                b[i].show();
        }
 
        cout << "low mediana= " << RavnTriangle::lowmediana(b, m) << endl;;
        system("pause");
        return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2017, 18:45
Ответы с готовыми решениями:

Наследование. Конструктор базового класса в теле производного
Здравствуйте! Помогите, пожалуйста, разобраться. Есть пример: class String { protected:...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp,...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его...

2
7648 / 6454 / 2943
Регистрация: 14.04.2014
Сообщений: 28,135
16.11.2017, 19:18 2
И как он будет без координат?
0
4055 / 3309 / 924
Регистрация: 25.03.2012
Сообщений: 12,451
Записей в блоге: 1
16.11.2017, 19:23 3
HitGirl, вы вообще понимаете, что такое наследование? Вы понимаете, что при наследовании вы никак от полей базового класса не избавитесь, даже если как-то измените конструктор? Что за бред?!!
C++
1
2
3
class RavnTriangle:public Triangle
{
};
уже этот пустой класс сам по себе будет хранить в себе 3 точки! В этом и есть суть наследования! Если тебе не надо хранить 3 точки в классе, называй его как хочешь, но не наследуй от треугольника!
1
16.11.2017, 19:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2017, 19:23
Помогаю со студенческими работами здесь

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A-&gt;B а от B наследуются одновременно еще два класса B-&gt;C и B-&gt;D...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; }...

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной ситуации на...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru